jekyll-theme-zer0 0.20.2 → 0.20.3
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 +22 -0
- data/_data/navigation/main.yml +37 -5
- data/_data/navigation/posts.yml +10 -10
- data/_includes/components/post-card.html +14 -2
- data/_includes/components/post-type-badge.html +74 -0
- data/_includes/navigation/section-sidebar.html +242 -0
- data/_layouts/README.md +68 -15
- data/_layouts/article.html +519 -0
- data/_layouts/default.html +6 -0
- data/_layouts/{blog.html → news.html} +211 -50
- data/_layouts/note.html +307 -0
- data/_layouts/section.html +573 -0
- data/_sass/custom.scss +257 -0
- data/assets/data/notebooks/sales_data.csv +99 -0
- data/assets/data/notebooks/survey_responses.csv +76 -0
- data/assets/data/notebooks/weather_data.csv +50 -0
- metadata +11 -5
- data/_layouts/category.html +0 -237
- data/_layouts/journals.html +0 -277
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9a016d0fb4fa27f203571798256f468d7a19a71100ad551bd69e799c6b9797f3
|
|
4
|
+
data.tar.gz: 458cc17ae4e8ea22eea496b213d4e4e6c496c128600ce1010d9f0d2f26bd9c45
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0f36f8cb07f2d8d426d6b8e9f441c38e8dbe82a07b502f1117f52ed97a9affc180e135c5df47b0c3e23f06fa8f3489395c84d30dc94882d3b9f735dd1645e952
|
|
7
|
+
data.tar.gz: 0ef53bfa08a6fbc498c25e6d4776fed5b343e2a49e9d8d70cfea2361f1a62dc62fa052dc6ccf27bd06356a8bdd7d06896223cfdd4a9aa3795ecfa80fe84b664d
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.20.3] - 2026-02-01
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Notes Collection**: 5 new developer reference notes
|
|
7
|
+
- `bash-shortcuts.md` - Essential terminal keyboard shortcuts
|
|
8
|
+
- `docker-commands.md` - Docker and Docker Compose command reference
|
|
9
|
+
- `git-cheatsheet.md` - Git commands quick reference
|
|
10
|
+
- `jekyll-front-matter.md` - Jekyll front matter variables guide
|
|
11
|
+
- `markdown-tips.md` - Advanced Markdown formatting tricks
|
|
12
|
+
- **Python Statistics Notebook**: New `python-statistics.ipynb` Jupyter notebook with scipy, pandas, and statistical analysis examples
|
|
13
|
+
- **Enhanced Notes page**: Added tag filtering and improved card-based layout
|
|
14
|
+
- **Enhanced Notebooks page**: Added difficulty filtering and improved card-based layout with download links
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- **Layout Standardization**: Updated all posts from `layout: journals` to `layout: article` for consistency
|
|
18
|
+
- **Section Index Pages**: Updated category index pages to use `layout: section` with proper section_style settings
|
|
19
|
+
- **News URL Structure**: Changed permalinks from `/posts/` to `/news/` across all news sections
|
|
20
|
+
- **Removed**: Deleted unused `pages/blog.md` page
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- **Layout consistency**: Standardized layouts across Business, Development, Science, Technology, Tutorial, and World news sections
|
|
24
|
+
|
|
3
25
|
## [0.20.2] - 2026-01-30
|
|
4
26
|
|
|
5
27
|
### Added
|
data/_data/navigation/main.yml
CHANGED
|
@@ -14,17 +14,49 @@
|
|
|
14
14
|
- title: GitHub Setup
|
|
15
15
|
url: /quickstart/github-setup/
|
|
16
16
|
|
|
17
|
-
- title:
|
|
18
|
-
icon: bi-
|
|
19
|
-
url: /
|
|
17
|
+
- title: News
|
|
18
|
+
icon: bi-newspaper
|
|
19
|
+
url: /news/
|
|
20
20
|
children:
|
|
21
|
-
- title: All
|
|
22
|
-
url: /
|
|
21
|
+
- title: All News
|
|
22
|
+
url: /news/
|
|
23
23
|
- title: Categories
|
|
24
24
|
url: /categories/
|
|
25
25
|
- title: Tags
|
|
26
26
|
url: /tags/
|
|
27
27
|
|
|
28
|
+
- title: Notes
|
|
29
|
+
icon: bi-journal-text
|
|
30
|
+
url: /notes/
|
|
31
|
+
children:
|
|
32
|
+
- title: All Notes
|
|
33
|
+
url: /notes/
|
|
34
|
+
- title: Git Cheatsheet
|
|
35
|
+
url: /notes/git-cheatsheet/
|
|
36
|
+
- title: Docker Commands
|
|
37
|
+
url: /notes/docker-commands/
|
|
38
|
+
- title: Jekyll Front Matter
|
|
39
|
+
url: /notes/jekyll-front-matter/
|
|
40
|
+
- title: Markdown Tips
|
|
41
|
+
url: /notes/markdown-tips/
|
|
42
|
+
- title: Bash Shortcuts
|
|
43
|
+
url: /notes/bash-shortcuts/
|
|
44
|
+
|
|
45
|
+
- title: Notebooks
|
|
46
|
+
icon: bi-journal-code
|
|
47
|
+
url: /notebooks/
|
|
48
|
+
children:
|
|
49
|
+
- title: All Notebooks
|
|
50
|
+
url: /notebooks/
|
|
51
|
+
- title: Pandas Data Analysis
|
|
52
|
+
url: /notebooks/pandas-data-analysis/
|
|
53
|
+
- title: Matplotlib Visualization
|
|
54
|
+
url: /notebooks/matplotlib-visualization/
|
|
55
|
+
- title: Python Statistics
|
|
56
|
+
url: /notebooks/python-statistics/
|
|
57
|
+
- title: API Requests
|
|
58
|
+
url: /notebooks/api-requests/
|
|
59
|
+
|
|
28
60
|
- title: Docs
|
|
29
61
|
icon: bi-journal-bookmark
|
|
30
62
|
url: /docs/
|
data/_data/navigation/posts.yml
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Used by:
|
|
3
|
-
# Purpose:
|
|
4
|
-
# Note:
|
|
1
|
+
# News Section Navigation Configuration
|
|
2
|
+
# Used by: News layout, section pages, and article navigation
|
|
3
|
+
# Purpose: Section-based navigation for news content
|
|
4
|
+
# Note: Sections match folders in pages/_posts/
|
|
5
5
|
|
|
6
6
|
- title: Development
|
|
7
7
|
icon: bi-code-slash
|
|
8
|
-
url: /
|
|
8
|
+
url: /news/development/
|
|
9
9
|
description: "Software development, coding practices, and programming tutorials"
|
|
10
10
|
|
|
11
11
|
- title: Technology
|
|
12
12
|
icon: bi-cpu
|
|
13
|
-
url: /
|
|
13
|
+
url: /news/technology/
|
|
14
14
|
description: "Tech news, tools, and emerging technologies"
|
|
15
15
|
|
|
16
16
|
- title: Tutorial
|
|
17
17
|
icon: bi-journal-code
|
|
18
|
-
url: /
|
|
18
|
+
url: /news/tutorial/
|
|
19
19
|
description: "Step-by-step guides and how-to articles"
|
|
20
20
|
|
|
21
21
|
- title: World
|
|
22
22
|
icon: bi-globe
|
|
23
|
-
url: /
|
|
23
|
+
url: /news/world/
|
|
24
24
|
description: "Global trends, remote work, and industry insights"
|
|
25
25
|
|
|
26
26
|
- title: Business
|
|
27
27
|
icon: bi-briefcase
|
|
28
|
-
url: /
|
|
28
|
+
url: /news/business/
|
|
29
29
|
description: "Business strategies, startups, and entrepreneurship"
|
|
30
30
|
|
|
31
31
|
- title: Science
|
|
32
32
|
icon: bi-mortarboard
|
|
33
|
-
url: /
|
|
33
|
+
url: /news/science/
|
|
34
34
|
description: "Scientific discoveries, research, and innovation"
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
File: post-card.html
|
|
7
7
|
Path: _includes/components/post-card.html
|
|
8
|
-
Purpose: Consistent post card display across
|
|
8
|
+
Purpose: Consistent post card display across news, section, and archive pages
|
|
9
9
|
|
|
10
10
|
Parameters:
|
|
11
11
|
- post (required): The post object to display
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
- show_excerpt (optional): Show post excerpt (default: true)
|
|
14
14
|
- show_author (optional): Show author name (default: true)
|
|
15
15
|
- show_reading_time (optional): Show reading time (default: true)
|
|
16
|
+
- show_post_type (optional): Show post_type badge (default: true)
|
|
16
17
|
- card_class (optional): Additional CSS classes for the card
|
|
17
18
|
|
|
18
19
|
Usage:
|
|
@@ -23,6 +24,7 @@
|
|
|
23
24
|
Features:
|
|
24
25
|
- Breaking news badge (red, top-left)
|
|
25
26
|
- Featured badge (gold star, top-right)
|
|
27
|
+
- Post type badge (contextual colors)
|
|
26
28
|
- Preview image with fallback
|
|
27
29
|
- Category badge
|
|
28
30
|
- Reading time calculation
|
|
@@ -33,6 +35,8 @@
|
|
|
33
35
|
Dependencies:
|
|
34
36
|
- Bootstrap 5 card components
|
|
35
37
|
- Bootstrap Icons
|
|
38
|
+
- components/post-type-badge.html
|
|
39
|
+
- components/preview-image.html
|
|
36
40
|
- site.public_folder for image paths
|
|
37
41
|
- site.teaser for fallback image
|
|
38
42
|
===================================================================
|
|
@@ -43,6 +47,7 @@
|
|
|
43
47
|
{% assign show_excerpt = include.show_excerpt | default: true %}
|
|
44
48
|
{% assign show_author = include.show_author | default: true %}
|
|
45
49
|
{% assign show_reading_time = include.show_reading_time | default: true %}
|
|
50
|
+
{% assign show_post_type = include.show_post_type | default: true %}
|
|
46
51
|
{% assign card_class = include.card_class | default: "" %}
|
|
47
52
|
|
|
48
53
|
{% comment %}
|
|
@@ -76,6 +81,13 @@
|
|
|
76
81
|
</span>
|
|
77
82
|
{% endif %}
|
|
78
83
|
|
|
84
|
+
<!-- Post Type Badge -->
|
|
85
|
+
{% if show_post_type and include.post.post_type and include.post.post_type != "standard" and include.post.post_type != "featured" and include.post.post_type != "breaking" %}
|
|
86
|
+
<span class="position-absolute bottom-0 start-0 m-2 z-1">
|
|
87
|
+
{% include components/post-type-badge.html post_type=include.post.post_type %}
|
|
88
|
+
</span>
|
|
89
|
+
{% endif %}
|
|
90
|
+
|
|
79
91
|
<!-- Preview Image -->
|
|
80
92
|
<a href="{{ include.post.url | relative_url }}" class="text-decoration-none">
|
|
81
93
|
{% assign card_img = include.post.preview | default: site.teaser %}
|
|
@@ -92,7 +104,7 @@
|
|
|
92
104
|
{% if show_category and include.post.categories.size > 0 %}
|
|
93
105
|
<div class="mb-2">
|
|
94
106
|
{% assign primary_category = include.post.categories | first %}
|
|
95
|
-
<a href="{{ site.baseurl }}/
|
|
107
|
+
<a href="{{ site.baseurl }}/news/{{ primary_category | slugify }}/"
|
|
96
108
|
class="badge bg-primary text-decoration-none">
|
|
97
109
|
{{ primary_category }}
|
|
98
110
|
</a>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
===================================================================
|
|
3
|
+
POST TYPE BADGE COMPONENT - Visual indicator for article types
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: post-type-badge.html
|
|
7
|
+
Path: _includes/components/post-type-badge.html
|
|
8
|
+
Purpose: Display Bootstrap badge based on post_type front matter
|
|
9
|
+
|
|
10
|
+
Parameters:
|
|
11
|
+
- post_type (required): The type of post to display badge for
|
|
12
|
+
|
|
13
|
+
Supported post_type values:
|
|
14
|
+
- standard: No badge (default behavior)
|
|
15
|
+
- featured: Gold star badge (bg-warning)
|
|
16
|
+
- breaking: Red urgent badge (bg-danger)
|
|
17
|
+
- opinion: Gray editorial badge (bg-secondary)
|
|
18
|
+
- review: Blue review badge (bg-info)
|
|
19
|
+
- tutorial: Green learning badge (bg-success)
|
|
20
|
+
- listicle: Primary list badge (bg-primary)
|
|
21
|
+
- interview: Dark Q&A badge (bg-dark)
|
|
22
|
+
|
|
23
|
+
Usage:
|
|
24
|
+
{% include components/post-type-badge.html post_type=page.post_type %}
|
|
25
|
+
{% include components/post-type-badge.html post_type=post.post_type %}
|
|
26
|
+
|
|
27
|
+
Dependencies:
|
|
28
|
+
- Bootstrap 5 badge component
|
|
29
|
+
- Bootstrap Icons
|
|
30
|
+
===================================================================
|
|
31
|
+
-->
|
|
32
|
+
|
|
33
|
+
{% assign type = include.post_type | default: "standard" %}
|
|
34
|
+
|
|
35
|
+
{% case type %}
|
|
36
|
+
{% when "featured" %}
|
|
37
|
+
<span class="badge bg-warning text-dark">
|
|
38
|
+
<i class="bi bi-star-fill me-1"></i>Featured
|
|
39
|
+
</span>
|
|
40
|
+
|
|
41
|
+
{% when "breaking" %}
|
|
42
|
+
<span class="badge bg-danger">
|
|
43
|
+
<i class="bi bi-lightning-fill me-1"></i>Breaking
|
|
44
|
+
</span>
|
|
45
|
+
|
|
46
|
+
{% when "opinion" %}
|
|
47
|
+
<span class="badge bg-secondary">
|
|
48
|
+
<i class="bi bi-pencil-square me-1"></i>Opinion
|
|
49
|
+
</span>
|
|
50
|
+
|
|
51
|
+
{% when "review" %}
|
|
52
|
+
<span class="badge bg-info text-dark">
|
|
53
|
+
<i class="bi bi-star-half me-1"></i>Review
|
|
54
|
+
</span>
|
|
55
|
+
|
|
56
|
+
{% when "tutorial" %}
|
|
57
|
+
<span class="badge bg-success">
|
|
58
|
+
<i class="bi bi-book me-1"></i>Tutorial
|
|
59
|
+
</span>
|
|
60
|
+
|
|
61
|
+
{% when "listicle" %}
|
|
62
|
+
<span class="badge bg-primary">
|
|
63
|
+
<i class="bi bi-list-ol me-1"></i>Listicle
|
|
64
|
+
</span>
|
|
65
|
+
|
|
66
|
+
{% when "interview" %}
|
|
67
|
+
<span class="badge bg-dark">
|
|
68
|
+
<i class="bi bi-mic me-1"></i>Interview
|
|
69
|
+
</span>
|
|
70
|
+
|
|
71
|
+
{% when "standard" %}
|
|
72
|
+
{% comment %} No badge for standard posts {% endcomment %}
|
|
73
|
+
|
|
74
|
+
{% endcase %}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
===================================================================
|
|
3
|
+
SECTION SIDEBAR - Fixed Topic Navigation
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: section-sidebar.html
|
|
7
|
+
Path: _includes/navigation/section-sidebar.html
|
|
8
|
+
Purpose: Fixed sticky sidebar for section/topic navigation
|
|
9
|
+
|
|
10
|
+
Parameters:
|
|
11
|
+
- section_posts: Array of posts in the current section
|
|
12
|
+
- sub_categories: Array of unique tags/topics from section posts
|
|
13
|
+
- page_title: Title of the current section
|
|
14
|
+
- sidebar_id: Unique ID for the sidebar (default: "sectionSidebar")
|
|
15
|
+
|
|
16
|
+
Features:
|
|
17
|
+
- Desktop: Fixed sticky sidebar on the left
|
|
18
|
+
- Mobile: Offcanvas drawer
|
|
19
|
+
- Topic navigation with article counts
|
|
20
|
+
- Section statistics
|
|
21
|
+
- Smooth scroll to sections
|
|
22
|
+
|
|
23
|
+
Dependencies:
|
|
24
|
+
- Bootstrap 5 offcanvas component
|
|
25
|
+
- Bootstrap Icons
|
|
26
|
+
===================================================================
|
|
27
|
+
-->
|
|
28
|
+
|
|
29
|
+
{% assign sidebar_id = include.sidebar_id | default: "sectionSidebar" %}
|
|
30
|
+
{% assign section_posts = include.section_posts %}
|
|
31
|
+
{% assign sub_categories = include.sub_categories %}
|
|
32
|
+
{% assign page_title = include.page_title | default: page.title %}
|
|
33
|
+
|
|
34
|
+
<!-- ================================ -->
|
|
35
|
+
<!-- DESKTOP SIDEBAR (Fixed Sticky) -->
|
|
36
|
+
<!-- ================================ -->
|
|
37
|
+
<aside class="section-sidebar-desktop d-none d-lg-block">
|
|
38
|
+
<div class="position-sticky" style="top: 80px;">
|
|
39
|
+
|
|
40
|
+
<!-- Topics Card -->
|
|
41
|
+
<div class="card border-0 shadow-sm">
|
|
42
|
+
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
|
|
43
|
+
<h5 class="mb-0">
|
|
44
|
+
<i class="bi bi-bookmark me-2"></i>Topics
|
|
45
|
+
</h5>
|
|
46
|
+
<span class="badge bg-light text-primary">{{ sub_categories.size }}</span>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="card-body p-0">
|
|
49
|
+
<nav class="nav flex-column sidebar-nav">
|
|
50
|
+
<a class="nav-link active" href="#all-posts" data-section="all-posts">
|
|
51
|
+
<i class="bi bi-grid me-2"></i>
|
|
52
|
+
<span class="nav-text">All Articles</span>
|
|
53
|
+
<span class="badge bg-secondary ms-auto">{{ section_posts.size }}</span>
|
|
54
|
+
</a>
|
|
55
|
+
{% for subcat in sub_categories limit: 15 %}
|
|
56
|
+
{% assign subcat_posts = section_posts | where_exp: "post", "post.tags contains subcat" %}
|
|
57
|
+
{% if subcat_posts.size > 0 %}
|
|
58
|
+
<a class="nav-link" href="#{{ subcat | slugify }}" data-section="{{ subcat | slugify }}">
|
|
59
|
+
<i class="bi bi-tag me-2"></i>
|
|
60
|
+
<span class="nav-text">{{ subcat | capitalize }}</span>
|
|
61
|
+
<span class="badge bg-light text-dark ms-auto">{{ subcat_posts.size }}</span>
|
|
62
|
+
</a>
|
|
63
|
+
{% endif %}
|
|
64
|
+
{% endfor %}
|
|
65
|
+
</nav>
|
|
66
|
+
</div>
|
|
67
|
+
{% if sub_categories.size > 15 %}
|
|
68
|
+
<div class="card-footer bg-transparent">
|
|
69
|
+
<a href="{{ site.baseurl }}/tags/" class="btn btn-sm btn-outline-secondary w-100">
|
|
70
|
+
View All Tags <i class="bi bi-arrow-right ms-1"></i>
|
|
71
|
+
</a>
|
|
72
|
+
</div>
|
|
73
|
+
{% endif %}
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- Section Stats -->
|
|
77
|
+
<div class="card border-0 shadow-sm mt-3">
|
|
78
|
+
<div class="card-body">
|
|
79
|
+
<h6 class="text-muted mb-3">
|
|
80
|
+
<i class="bi bi-graph-up me-2"></i>Section Stats
|
|
81
|
+
</h6>
|
|
82
|
+
<div class="d-flex justify-content-between mb-2">
|
|
83
|
+
<small class="text-muted">Total Articles</small>
|
|
84
|
+
<strong>{{ section_posts.size }}</strong>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="d-flex justify-content-between mb-2">
|
|
87
|
+
<small class="text-muted">Topics</small>
|
|
88
|
+
<strong>{{ sub_categories.size }}</strong>
|
|
89
|
+
</div>
|
|
90
|
+
{% assign featured_count = section_posts | where: "featured", true | size %}
|
|
91
|
+
<div class="d-flex justify-content-between">
|
|
92
|
+
<small class="text-muted">Featured</small>
|
|
93
|
+
<strong>{{ featured_count }}</strong>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</aside>
|
|
99
|
+
|
|
100
|
+
<!-- ================================ -->
|
|
101
|
+
<!-- MOBILE OFFCANVAS SIDEBAR -->
|
|
102
|
+
<!-- ================================ -->
|
|
103
|
+
<div class="offcanvas offcanvas-start" tabindex="-1" id="{{ sidebar_id }}" aria-labelledby="{{ sidebar_id }}Label">
|
|
104
|
+
<div class="offcanvas-header bg-primary text-white">
|
|
105
|
+
<h5 class="offcanvas-title" id="{{ sidebar_id }}Label">
|
|
106
|
+
<i class="bi bi-bookmark me-2"></i>{{ page_title }} Topics
|
|
107
|
+
</h5>
|
|
108
|
+
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
|
109
|
+
</div>
|
|
110
|
+
<div class="offcanvas-body p-0">
|
|
111
|
+
<nav class="nav flex-column">
|
|
112
|
+
<a class="nav-link active bg-light py-3 border-bottom" href="#all-posts" data-bs-dismiss="offcanvas">
|
|
113
|
+
<i class="bi bi-grid me-2"></i>All Articles
|
|
114
|
+
<span class="badge bg-secondary float-end">{{ section_posts.size }}</span>
|
|
115
|
+
</a>
|
|
116
|
+
{% for subcat in sub_categories %}
|
|
117
|
+
{% assign subcat_posts = section_posts | where_exp: "post", "post.tags contains subcat" %}
|
|
118
|
+
{% if subcat_posts.size > 0 %}
|
|
119
|
+
<a class="nav-link text-body-secondary py-3 border-bottom" href="#{{ subcat | slugify }}" data-bs-dismiss="offcanvas">
|
|
120
|
+
<i class="bi bi-tag me-2"></i>{{ subcat | capitalize }}
|
|
121
|
+
<span class="badge bg-light text-dark float-end">{{ subcat_posts.size }}</span>
|
|
122
|
+
</a>
|
|
123
|
+
{% endif %}
|
|
124
|
+
{% endfor %}
|
|
125
|
+
</nav>
|
|
126
|
+
<div class="p-3">
|
|
127
|
+
<a href="{{ site.baseurl }}/tags/" class="btn btn-outline-primary w-100">
|
|
128
|
+
<i class="bi bi-tags me-2"></i>Browse All Tags
|
|
129
|
+
</a>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<!-- ================================ -->
|
|
135
|
+
<!-- SIDEBAR STYLES -->
|
|
136
|
+
<!-- ================================ -->
|
|
137
|
+
<style>
|
|
138
|
+
/* Sidebar Navigation */
|
|
139
|
+
.sidebar-nav .nav-link {
|
|
140
|
+
padding: 0.75rem 1rem;
|
|
141
|
+
border-left: 3px solid transparent;
|
|
142
|
+
transition: all 0.2s ease;
|
|
143
|
+
display: flex;
|
|
144
|
+
align-items: center;
|
|
145
|
+
color: var(--bs-body-color);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.sidebar-nav .nav-link:hover {
|
|
149
|
+
background-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
150
|
+
border-left-color: var(--bs-primary);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.sidebar-nav .nav-link.active {
|
|
154
|
+
background-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
155
|
+
border-left-color: var(--bs-primary);
|
|
156
|
+
font-weight: 500;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.sidebar-nav .nav-text {
|
|
160
|
+
flex-grow: 1;
|
|
161
|
+
white-space: nowrap;
|
|
162
|
+
overflow: hidden;
|
|
163
|
+
text-overflow: ellipsis;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* Offcanvas mobile styling */
|
|
167
|
+
.offcanvas .nav-link {
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
justify-content: space-between;
|
|
171
|
+
}
|
|
172
|
+
</style>
|
|
173
|
+
|
|
174
|
+
<!-- ================================ -->
|
|
175
|
+
<!-- SIDEBAR JAVASCRIPT -->
|
|
176
|
+
<!-- ================================ -->
|
|
177
|
+
<script>
|
|
178
|
+
(function() {
|
|
179
|
+
// Smooth scroll for sidebar links
|
|
180
|
+
function setupSmoothScroll() {
|
|
181
|
+
document.querySelectorAll('.sidebar-nav a[href^="#"], .offcanvas a[href^="#"]').forEach(anchor => {
|
|
182
|
+
anchor.addEventListener('click', function(e) {
|
|
183
|
+
const href = this.getAttribute('href');
|
|
184
|
+
if (href.length > 1) {
|
|
185
|
+
e.preventDefault();
|
|
186
|
+
const target = document.querySelector(href);
|
|
187
|
+
if (target) {
|
|
188
|
+
target.scrollIntoView({ behavior: 'smooth' });
|
|
189
|
+
|
|
190
|
+
// Update active state in sidebar
|
|
191
|
+
document.querySelectorAll('.sidebar-nav .nav-link').forEach(link => {
|
|
192
|
+
link.classList.remove('active');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Find and activate the corresponding link in desktop sidebar
|
|
196
|
+
const desktopLink = document.querySelector(`.sidebar-nav a[href="${href}"]`);
|
|
197
|
+
if (desktopLink) {
|
|
198
|
+
desktopLink.classList.add('active');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Intersection Observer for active section highlighting
|
|
207
|
+
function setupScrollSpy() {
|
|
208
|
+
const sections = document.querySelectorAll('section[id]');
|
|
209
|
+
|
|
210
|
+
if (sections.length === 0) return;
|
|
211
|
+
|
|
212
|
+
const observer = new IntersectionObserver((entries) => {
|
|
213
|
+
entries.forEach(entry => {
|
|
214
|
+
if (entry.isIntersecting) {
|
|
215
|
+
const id = entry.target.getAttribute('id');
|
|
216
|
+
document.querySelectorAll('.sidebar-nav .nav-link').forEach(link => {
|
|
217
|
+
link.classList.remove('active');
|
|
218
|
+
if (link.getAttribute('href') === `#${id}`) {
|
|
219
|
+
link.classList.add('active');
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}, {
|
|
225
|
+
rootMargin: '-20% 0px -80% 0px'
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
sections.forEach(section => observer.observe(section));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Initialize when DOM is ready
|
|
232
|
+
if (document.readyState === 'loading') {
|
|
233
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
234
|
+
setupSmoothScroll();
|
|
235
|
+
setupScrollSpy();
|
|
236
|
+
});
|
|
237
|
+
} else {
|
|
238
|
+
setupSmoothScroll();
|
|
239
|
+
setupScrollSpy();
|
|
240
|
+
}
|
|
241
|
+
})();
|
|
242
|
+
</script>
|
data/_layouts/README.md
CHANGED
|
@@ -9,11 +9,12 @@ structure, and usage patterns.
|
|
|
9
9
|
```text
|
|
10
10
|
root.html (base template)
|
|
11
11
|
├── default.html (sidebar layout)
|
|
12
|
-
│ ├──
|
|
12
|
+
│ ├── article.html (single articles/posts)
|
|
13
|
+
│ ├── section.html (section index pages)
|
|
13
14
|
│ ├── collection.html (collection pages)
|
|
14
15
|
│ └── javascript.html (JavaScript demos)
|
|
15
16
|
├── home.html (homepage)
|
|
16
|
-
├──
|
|
17
|
+
├── news.html (news homepage - magazine/grid/list styles)
|
|
17
18
|
├── landing.html (landing pages)
|
|
18
19
|
├── stats.html (statistics dashboard)
|
|
19
20
|
└── index.html (search pages)
|
|
@@ -34,17 +35,37 @@ root.html (base template)
|
|
|
34
35
|
|
|
35
36
|
- **Purpose**: Standard content layout with sidebars
|
|
36
37
|
- **Features**: Three-column responsive layout, navigation, table of contents
|
|
38
|
+
- **Features (Updated)**: Sidebar toggle via `page.sidebar: false` front matter
|
|
37
39
|
- **Dependencies**: sidebar-left.html, intro.html, sidebar-right.html
|
|
38
40
|
- **Usage**: Documentation pages, standard content
|
|
39
41
|
|
|
40
|
-
###
|
|
42
|
+
### 📰 News & Article Layouts
|
|
41
43
|
|
|
42
|
-
#### `
|
|
44
|
+
#### `news.html`
|
|
43
45
|
|
|
44
|
-
- **Purpose**:
|
|
45
|
-
- **Features**:
|
|
46
|
-
- **
|
|
47
|
-
- **
|
|
46
|
+
- **Purpose**: News homepage with multiple display styles
|
|
47
|
+
- **Features**: Magazine, grid, and list layouts via `section_style` front matter
|
|
48
|
+
- **Front Matter**: `section_style: magazine|grid|list` (required)
|
|
49
|
+
- **Dependencies**: post-card.html, post-type-badge.html
|
|
50
|
+
- **Usage**: Main news index at /news/
|
|
51
|
+
|
|
52
|
+
#### `article.html`
|
|
53
|
+
|
|
54
|
+
- **Purpose**: Single article display with post_type variations
|
|
55
|
+
- **Features**: Conditional rendering based on `post_type` front matter
|
|
56
|
+
- **Post Types**: standard, featured, breaking, opinion, review, tutorial, listicle, interview
|
|
57
|
+
- **Dependencies**: post-type-badge.html, giscus.html for comments
|
|
58
|
+
- **Usage**: Individual news articles and blog posts
|
|
59
|
+
|
|
60
|
+
#### `section.html`
|
|
61
|
+
|
|
62
|
+
- **Purpose**: Section index pages for content categories
|
|
63
|
+
- **Features**: Path-based article discovery, multiple display styles
|
|
64
|
+
- **Front Matter**: `section_style: magazine|grid|list` (required)
|
|
65
|
+
- **Dependencies**: post-card.html, post-type-badge.html
|
|
66
|
+
- **Usage**: Section landing pages (e.g., /news/technology/, /news/business/)
|
|
67
|
+
|
|
68
|
+
### 📝 Collection Layouts
|
|
48
69
|
|
|
49
70
|
#### `collection.html`
|
|
50
71
|
|
|
@@ -53,13 +74,6 @@ root.html (base template)
|
|
|
53
74
|
- **Dependencies**: Bootstrap card components
|
|
54
75
|
- **Usage**: Portfolio, projects, grouped content
|
|
55
76
|
|
|
56
|
-
#### `blog.html`
|
|
57
|
-
|
|
58
|
-
- **Purpose**: Magazine-style blog homepage
|
|
59
|
-
- **Features**: Featured posts, sidebar, responsive design
|
|
60
|
-
- **Dependencies**: sidebar-categories.html, navigation data
|
|
61
|
-
- **Usage**: Blog index and homepage
|
|
62
|
-
|
|
63
77
|
### 🎯 Specialized Layouts
|
|
64
78
|
|
|
65
79
|
#### `home.html`
|
|
@@ -97,6 +111,45 @@ root.html (base template)
|
|
|
97
111
|
- **Dependencies**: Custom JavaScript functions
|
|
98
112
|
- **Usage**: Tutorials, interactive demos
|
|
99
113
|
|
|
114
|
+
## Front Matter Reference
|
|
115
|
+
|
|
116
|
+
### Article Layout (`article.html`)
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
layout: article
|
|
120
|
+
post_type: standard|featured|breaking|opinion|review|tutorial|listicle|interview
|
|
121
|
+
sidebar: true|false # Optional, defaults to true (false for featured/breaking)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Section/News Layouts (`section.html`, `news.html`)
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
layout: section|news
|
|
128
|
+
section_style: magazine|grid|list # Required - no default
|
|
129
|
+
index: true # Marks page as index (excluded from listings)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Display Styles
|
|
133
|
+
|
|
134
|
+
| Style | Description |
|
|
135
|
+
|-------|-------------|
|
|
136
|
+
| `magazine` | Hero article + grid of remaining posts |
|
|
137
|
+
| `grid` | 3-column card grid layout |
|
|
138
|
+
| `list` | Horizontal row layout with thumbnails |
|
|
139
|
+
|
|
140
|
+
### Post Types with Badge Colors
|
|
141
|
+
|
|
142
|
+
| Type | Badge Color | Description |
|
|
143
|
+
|------|-------------|-------------|
|
|
144
|
+
| `featured` | Yellow (warning) | Featured/highlighted content |
|
|
145
|
+
| `breaking` | Red (danger) | Breaking news |
|
|
146
|
+
| `opinion` | Purple | Opinion/editorial pieces |
|
|
147
|
+
| `review` | Cyan (info) | Product/service reviews |
|
|
148
|
+
| `tutorial` | Green (success) | How-to guides |
|
|
149
|
+
| `listicle` | Secondary | List-style articles |
|
|
150
|
+
| `interview` | Dark | Interview content |
|
|
151
|
+
| `standard` | Light | Default article type |
|
|
152
|
+
|
|
100
153
|
## Comment Organization Standards
|
|
101
154
|
|
|
102
155
|
Each layout file now includes:
|