jekyll-theme-zer0 0.2.0 → 0.4.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -0
  3. data/README.md +455 -417
  4. data/_data/navigation/about.yml +2 -0
  5. data/_data/navigation/main.yml +17 -11
  6. data/_data/navigation/quickstart.yml +12 -0
  7. data/_includes/README.md +97 -0
  8. data/_includes/{info-section.html → components/info-section.html} +4 -4
  9. data/_includes/components/mermaid.html +101 -0
  10. data/_includes/content/giscus.html +60 -0
  11. data/_includes/content/intro.html +66 -0
  12. data/_includes/{sitemap.html → content/sitemap.html} +1 -1
  13. data/_includes/{toc.html → content/toc.html} +1 -1
  14. data/_includes/{branding.html → core/branding.html} +2 -2
  15. data/_includes/core/footer.html +167 -0
  16. data/_includes/core/head.html +163 -0
  17. data/_includes/core/header.html +125 -0
  18. data/_includes/landing/landing-install-cards.html +52 -0
  19. data/_includes/landing/landing-quick-links.html +28 -0
  20. data/_includes/navigation/navbar.html +96 -0
  21. data/_includes/navigation/sidebar-left.html +83 -0
  22. data/_includes/{sidebar-right.html → navigation/sidebar-right.html} +3 -10
  23. data/_layouts/README.md +8 -0
  24. data/_layouts/blog.html +2 -2
  25. data/_layouts/default.html +3 -3
  26. data/_layouts/journals.html +9 -80
  27. data/_layouts/landing.html +122 -45
  28. data/_layouts/root.html +6 -8
  29. data/assets/js/back-to-top.js +16 -19
  30. metadata +44 -69
  31. data/_includes/footer.html +0 -57
  32. data/_includes/giscus.html +0 -16
  33. data/_includes/head.html +0 -95
  34. data/_includes/header.html +0 -79
  35. data/_includes/intro.html +0 -68
  36. data/_includes/navbar.html +0 -34
  37. data/_includes/sidebar-left.html +0 -41
  38. data/_includes/toc +0 -7
  39. data/_layouts/javascript.html +0 -63
  40. /data/_includes/{google-analytics.html → analytics/google-analytics.html} +0 -0
  41. /data/_includes/{google-tag-manager-body.html → analytics/google-tag-manager-body.html} +0 -0
  42. /data/_includes/{google-tag-manager-head.html → analytics/google-tag-manager-head.html} +0 -0
  43. /data/_includes/{dev-shortcuts.html → components/dev-shortcuts.html} +0 -0
  44. /data/_includes/{halfmoon.html → components/halfmoon.html} +0 -0
  45. /data/_includes/{js-cdn.html → components/js-cdn.html} +0 -0
  46. /data/_includes/{powered-by.html → components/powered-by.html} +0 -0
  47. /data/_includes/{quick-index.html → components/quick-index.html} +0 -0
  48. /data/_includes/{searchbar.html → components/searchbar.html} +0 -0
  49. /data/_includes/{svg.html → components/svg.html} +0 -0
  50. /data/_includes/{zer0-env-var.html → components/zer0-env-var.html} +0 -0
  51. /data/_includes/{seo.html → content/seo.html} +0 -0
  52. /data/_includes/{style.html → docs/bootstrap-docs.html} +0 -0
  53. /data/_includes/{breadcrumbs.html → navigation/breadcrumbs.html} +0 -0
  54. /data/_includes/{nav_list.html → navigation/nav_list.html} +0 -0
  55. /data/_includes/{sidebar-categories.html → navigation/sidebar-categories.html} +0 -0
  56. /data/_includes/{sidebar-folders.html → navigation/sidebar-folders.html} +0 -0
@@ -8,5 +8,7 @@
8
8
  url: /terms
9
9
  - title: Sitemap
10
10
  url: /about/sitemap
11
+ - title: Stats
12
+ url: /stats
11
13
  url: /about/
12
14
 
@@ -1,27 +1,33 @@
1
- - title: Quick-Start
2
- url: /quickstart
1
+ - title: Quick Start
2
+ url: /quickstart/
3
3
  sublinks:
4
4
  - title: zer0
5
5
  url: /zer0/
6
- - title: Master Setup
7
- url: /quickstart/machine-setup
6
+ - title: Machine Setup
7
+ url: /quickstart/machine-setup/
8
+ - title: "Jekyll Setup"
9
+ url: /quickstart/jekyll-setup/
10
+ - title: "GitHub Setup"
11
+ url: /quickstart/github-setup/
8
12
  - title: Blog
9
- url: /posts
13
+ url: /blog/
10
14
  sublinks:
11
- - title: Pages
12
- url: /pages
15
+ - title: All Posts
16
+ url: /posts/
17
+ - title: Stats
18
+ url: /stats/
13
19
  - title: Docs
14
20
  url: /docs/
15
21
  sublinks:
16
22
  - title: Jekyll
17
- url: /docs/jekyll
23
+ url: /docs/jekyll/
18
24
 
19
25
  - title: About
20
26
  url: /about/
21
27
  sublinks:
22
28
  - title: Config
23
- url: /about/config
29
+ url: /about/config/
24
30
  - title: Theme
25
- url: /about/theme
31
+ url: /about/theme/
26
32
  - title: Sitemap
27
- url: /about/sitemap
33
+ url: /about/sitemap/
@@ -0,0 +1,12 @@
1
+ - title: "Quick Start"
2
+ url: /quickstart/
3
+ sublinks:
4
+ - title: "Machine Setup"
5
+ url: /quickstart/machine-setup/
6
+ description: "Platform-specific setup and Docker installation"
7
+ - title: "Jekyll Setup"
8
+ url: /quickstart/jekyll-setup/
9
+ description: "Jekyll theme configuration and development environment"
10
+ - title: "GitHub Setup"
11
+ url: /quickstart/github-setup/
12
+ description: "Version control, GitHub integration, and deployment"
@@ -0,0 +1,97 @@
1
+ # _includes Directory Organization
2
+
3
+ This directory has been reorganized for better maintainability and clarity. Files are now grouped by functionality into subdirectories.
4
+
5
+ ## Directory Structure
6
+
7
+ ### `core/`
8
+
9
+ Essential layout components that form the foundation of the site:
10
+
11
+ - `head.html` - HTML document head with meta tags, scripts, and styles
12
+ - `header.html` - Main site header with navigation
13
+ - `footer.html` - Site footer (if exists)
14
+ - `branding.html` - Site branding and title display
15
+
16
+ ### `navigation/`
17
+
18
+ All navigation-related components:
19
+
20
+ - `navbar.html` - Main navigation menu
21
+ - `sidebar-left.html` - Left sidebar with dynamic navigation
22
+ - `sidebar-right.html` - Right sidebar content
23
+ - `sidebar-folders.html` - Dynamic folder structure generation
24
+ - `sidebar-categories.html` - Category-based navigation
25
+ - `nav_list.html` - Manual navigation list rendering
26
+ - `breadcrumbs.html` - Navigation breadcrumbs
27
+
28
+ ### `analytics/`
29
+
30
+ Analytics and tracking integrations:
31
+
32
+ - `google-analytics.html` - Google Analytics tracking
33
+ - `google-tag-manager-head.html` - GTM head section
34
+ - `google-tag-manager-body.html` - GTM body section
35
+
36
+ ### `components/`
37
+
38
+ Reusable UI components and widgets:
39
+
40
+ - `searchbar.html` - Search functionality
41
+ - `powered-by.html` - "Powered by" credits display
42
+ - `quick-index.html` - Quick page index
43
+ - `dev-shortcuts.html` - Developer shortcuts
44
+ - `info-section.html` - Settings/info modal
45
+ - `halfmoon.html` - Dark mode toggle
46
+ - `zer0-env-var.html` - Environment variable configuration
47
+ - `svg.html` - SVG icon definitions
48
+ - `js-cdn.html` - CDN JavaScript libraries
49
+
50
+ ### `content/`
51
+
52
+ Content-specific features and enhancements:
53
+
54
+ - `seo.html` - SEO meta tags and structured data
55
+ - `toc.html` - Table of contents generation
56
+ - `giscus.html` - GitHub Discussions comment system
57
+ - `intro.html` - Page introduction section
58
+ - `sitemap.html` - Sitemap generation
59
+
60
+ ### `landing/`
61
+
62
+ Landing page specific components:
63
+
64
+ - `landing-install-cards.html` - Installation method cards
65
+ - `landing-quick-links.html` - Quick links bar
66
+
67
+ ### `docs/`
68
+
69
+ Documentation and reference materials:
70
+
71
+ - `bootstrap-docs.html` - Bootstrap documentation (moved from style.html)
72
+
73
+ ## Usage
74
+
75
+ When including files in layouts or other templates, use the full path:
76
+
77
+ ```liquid
78
+ {% include core/head.html %}
79
+ {% include navigation/sidebar-left.html %}
80
+ {% include components/searchbar.html %}
81
+ {% include analytics/google-analytics.html %}
82
+ ```
83
+
84
+ ## Benefits of This Organization
85
+
86
+ 1. **Logical Grouping**: Related functionality is grouped together
87
+ 2. **Easier Maintenance**: Finding and editing specific components is simpler
88
+ 3. **Reduced Conflicts**: Clear separation reduces naming conflicts
89
+ 4. **Better Documentation**: Each directory has a clear purpose
90
+ 5. **Scalability**: Easy to add new components to appropriate directories
91
+
92
+ ## Migration Notes
93
+
94
+ - All include paths in layouts have been updated to reflect the new structure
95
+ - The duplicate `toc` file has been removed
96
+ - Large Bootstrap documentation moved to `docs/` directory
97
+ - No functionality has been changed, only organization
@@ -18,13 +18,13 @@
18
18
 
19
19
  <div class="container">
20
20
  <!-- _include/breadcrumbs.html -->
21
- {% include breadcrumbs.html %}
22
- {% include searchbar.html %}
21
+ {% include navigation/breadcrumbs.html %}
22
+ {% include components/searchbar.html %}
23
23
 
24
24
  <!-- Shortcuts to source bode -->
25
- {% include dev-shortcuts.html %}
25
+ {% include components/dev-shortcuts.html %}
26
26
  <!-- Dark Mode Switch -->
27
- {% include halfmoon.html %}
27
+ {% include components/halfmoon.html %}
28
28
  </div>
29
29
  </div>
30
30
  <div class="modal-footer">
@@ -0,0 +1,101 @@
1
+ <!--
2
+ ===================================================================
3
+ MERMAID DIAGRAM INTEGRATION
4
+ ===================================================================
5
+
6
+ File: mermaid.html
7
+ Path: _includes/components/mermaid.html
8
+ Purpose: Load and initialize Mermaid.js for diagram rendering
9
+
10
+ Usage:
11
+ - Set 'mermaid: true' in page front matter
12
+ - Use <div class="mermaid">...</div> syntax in content
13
+ - Supports all Mermaid diagram types (flowcharts, sequence, gantt, etc.)
14
+
15
+ Configuration:
16
+ - Latest stable version via CDN
17
+ - Forest theme for dark mode compatibility
18
+ - Initialized on document ready
19
+
20
+ Documentation:
21
+ - https://mermaid.js.org/
22
+ - https://github.com/mermaid-js/mermaid
23
+ ===================================================================
24
+ -->
25
+
26
+ <!-- Load Mermaid.js from CDN (latest stable version) -->
27
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
28
+
29
+ <!-- Initialize Mermaid with custom configuration -->
30
+ <script>
31
+ document.addEventListener('DOMContentLoaded', function() {
32
+ mermaid.initialize({
33
+ startOnLoad: true,
34
+ theme: 'forest', // Options: default, forest, dark, neutral, base
35
+ themeVariables: {
36
+ primaryColor: '#007bff',
37
+ primaryTextColor: '#fff',
38
+ primaryBorderColor: '#0056b3',
39
+ lineColor: '#6c757d',
40
+ secondaryColor: '#6c757d',
41
+ tertiaryColor: '#f8f9fa'
42
+ },
43
+ flowchart: {
44
+ useMaxWidth: true,
45
+ htmlLabels: true,
46
+ curve: 'basis'
47
+ },
48
+ sequence: {
49
+ diagramMarginX: 50,
50
+ diagramMarginY: 10,
51
+ actorMargin: 50,
52
+ width: 150,
53
+ height: 65,
54
+ boxMargin: 10,
55
+ boxTextMargin: 5,
56
+ noteMargin: 10,
57
+ messageMargin: 35,
58
+ mirrorActors: true,
59
+ bottomMarginAdj: 1,
60
+ useMaxWidth: true
61
+ },
62
+ gantt: {
63
+ titleTopMargin: 25,
64
+ barHeight: 20,
65
+ barGap: 4,
66
+ topPadding: 50,
67
+ leftPadding: 75,
68
+ gridLineStartPadding: 35,
69
+ fontSize: 11,
70
+ numberSectionStyles: 4,
71
+ axisFormat: '%Y-%m-%d'
72
+ }
73
+ });
74
+ console.log('Mermaid.js initialized successfully');
75
+ });
76
+ </script>
77
+
78
+ <!-- FontAwesome for Mermaid icon support (optional) -->
79
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" crossorigin="anonymous">
80
+
81
+ <!-- Custom CSS for Mermaid diagrams -->
82
+ <style>
83
+ .mermaid {
84
+ text-align: center;
85
+ margin: 2rem auto;
86
+ background-color: transparent;
87
+ }
88
+
89
+ /* Ensure diagrams are responsive */
90
+ .mermaid svg {
91
+ max-width: 100%;
92
+ height: auto;
93
+ }
94
+
95
+ /* Dark mode compatibility */
96
+ @media (prefers-color-scheme: dark) {
97
+ .mermaid {
98
+ filter: brightness(0.9);
99
+ }
100
+ }
101
+ </style>
@@ -0,0 +1,60 @@
1
+ <!--
2
+ ╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
3
+ ║ giscus.html ║
4
+ ║ GitHub Discussions Comment System ║
5
+ ╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
6
+ ║ ║
7
+ ║ Purpose: Integrates Giscus comment system powered by GitHub Discussions ║
8
+ ║ Location: /_includes/giscus.html ║
9
+ ║ Usage: {% include giscus.html %} (typically at bottom of posts/pages) ║
10
+ ║ Dependencies: GitHub repository with Discussions enabled, site.repository, site.giscus configuration ║
11
+ ║ ║
12
+ ║ Features: ║
13
+ ║ • GitHub Discussions-based commenting system ║
14
+ ║ • Automatic theme detection (preferred_color_scheme) ║
15
+ ║ • Pathname-based mapping for unique comment threads ║
16
+ ║ • Reaction support for enhanced user engagement ║
17
+ ║ • Top-positioned input for better UX ║
18
+ ║ ║
19
+ ║ Configuration Options: ║
20
+ ║ • data-repo: GitHub repository (site.repository) ║
21
+ ║ • data-repo-id: GitHub repository ID (site.giscus.data-repo-id) ║
22
+ ║ • data-category-id: Discussions category ID (site.giscus.data-category-id) ║
23
+ ║ • data-mapping: "pathname" - maps comments to page URL ║
24
+ ║ • data-strict: "1" - enables strict mapping mode ║
25
+ ║ ║
26
+ ║ Setup Requirements: ║
27
+ ║ • GitHub repository with Discussions feature enabled ║
28
+ ║ • Giscus app installed on the repository ║
29
+ ║ • Correct repo-id and category-id in _config.yml ║
30
+ ║ ║
31
+ ║ Reference: Feature Request #FR000001 ║
32
+ ║ Documentation: https://giscus.app/ ║
33
+ ║ ║
34
+ ╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
35
+ -->
36
+
37
+ <!-- ===================================================================================================== -->
38
+ <!-- GISCUS COMMENT SYSTEM -->
39
+ <!-- ===================================================================================================== -->
40
+ <!-- GitHub Discussions-powered comment system integration -->
41
+ <!-- Feature Request: #FR000001 -->
42
+ <!-- Documentation: https://giscus.app/ -->
43
+ <!-- Async loading: Non-blocking comment system initialization -->
44
+
45
+ <!-- giscus app - https://giscus.app/ - Feature # FR000001 -->
46
+
47
+ <script src="https://giscus.app/client.js"
48
+ data-repo="{{ site.repository }}"
49
+ data-repo-id="{{ site.giscus.data-repo-id }}"
50
+ data-category-id="{{ site.giscus.data-category-id }}"
51
+ data-mapping="pathname"
52
+ data-strict="1"
53
+ data-reactions-enabled="1"
54
+ data-emit-metadata="0"
55
+ data-input-position="top"
56
+ data-theme="preferred_color_scheme"
57
+ data-lang="en"
58
+ crossorigin="anonymous"
59
+ async>
60
+ </script>
@@ -0,0 +1,66 @@
1
+ <!--
2
+ file: _includes/intro.html
3
+ description: Enhanced intro section with improved share functionality and better button alignment
4
+ path: _includes/intro.html
5
+ features:
6
+ - Responsive share dropdown with multiple social platforms
7
+ - Properly aligned action buttons at bottom right
8
+ - Improved accessibility with icons and labels
9
+ - Clean button grouping with consistent spacing
10
+ -->
11
+ {% if page.collection %}
12
+ {% capture page_dir %}{{ site.collections_dir }}{% endcapture %}
13
+ {% assign testvar = "collection exists" %}
14
+ {% endif %}
15
+
16
+ <!-- Intro Section -->
17
+
18
+ <div class="bd-intro pt-5 ps-lg-2 position-relative" style="
19
+ background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('{{site.baseurl}}/{{ site.public_folder }}/{{ page.preview | default: site.info_banner }}') no-repeat center center / cover;
20
+ color: #fff;">
21
+
22
+ <br>
23
+ <h1>{{ page.title }}</h1>
24
+ <p>By {{ page.author | default: site.author.name }}</p>
25
+ <p>{{ page.description }}</p>
26
+ <p>Estimated reading time: {{ content | number_of_words | divided_by:200 }} minutes</p>
27
+ <!-- Action Buttons Group -->
28
+ <div class="position-absolute bottom-0 end-0 m-3 d-flex gap-2">
29
+ <!-- Share Button -->
30
+ <div class="dropdown">
31
+ <button class="btn btn-info dropdown-toggle" type="button" id="shareDropdownBottom" data-bs-toggle="dropdown" aria-expanded="false">
32
+ <i class="bi bi-share"></i>
33
+ <span class="d-none d-sm-inline ms-1">Share</span>
34
+ </button>
35
+ <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="shareDropdownBottom">
36
+ <li>
37
+ <a class="dropdown-item" href="https://reddit.com/submit?url={{ page.url | absolute_url | url_encode }}&amp;title={{ page.title | url_encode }}" target="_blank">
38
+ <i class="bi bi-reddit me-2"></i>Share on Reddit
39
+ </a>
40
+ </li>
41
+ <li>
42
+ <a class="dropdown-item" href="https://www.linkedin.com/sharing/share-offsite/?url={{ page.url | absolute_url | url_encode }}" target="_blank">
43
+ <i class="bi bi-linkedin me-2"></i>Share on LinkedIn
44
+ </a>
45
+ </li>
46
+ <li>
47
+ <a class="dropdown-item" href="https://twitter.com/intent/tweet?url={{ page.url | absolute_url | url_encode }}&text={{ page.title | url_encode }}" target="_blank">
48
+ <i class="bi bi-twitter me-2"></i>Share on Twitter
49
+ </a>
50
+ </li>
51
+ <li><hr class="dropdown-divider"></li>
52
+ <li>
53
+ <button class="dropdown-item" onclick='navigator.clipboard.writeText("{{ page.url | absolute_url }}"); alert("Link copied to clipboard!");'>
54
+ <i class="bi bi-clipboard me-2"></i>Copy Link
55
+ </button>
56
+ </li>
57
+ </ul>
58
+ </div>
59
+
60
+ <!-- Edit on Github Button -->
61
+ <a href="https://github.com/{{ site.repository }}/blob/master/{{ page_dir }}/{{ page.path }}" class="btn btn-dark">
62
+ <i class="bi bi-github"></i>
63
+ <span class="d-none d-sm-inline ms-1">Edit on GitHub</span>
64
+ </a>
65
+ </div>
66
+ </div>
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  file: sitemap.html
3
- path: _includes/sitemap.html
3
+ path: _includes/content/sitemap.html
4
4
  description: This is the snippet for the sitemap page.
5
5
  -->
6
6
 
@@ -30,7 +30,7 @@
30
30
  "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
31
31
 
32
32
  Usage:
33
- {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
33
+ {% include content/toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
34
34
 
35
35
  Parameters:
36
36
  * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
@@ -22,8 +22,8 @@
22
22
  <!-- Title Section -->
23
23
 
24
24
  <div class="navbar-brand">
25
- <a class="nav-link" href="{{ site.logo_link}}{{ page.url }}">
26
- <i class="d-sm-inline d-md-none {{ site.default_icon }} {{ site.default_icon }}-{{ site.title_icon | default: site.powered_by.default }}" aria-hidden="true"></i>
25
+ <a class="nav-link" href="{{ site.domain_url}}{{ page.url }}">
26
+ <i class="d-sm-inline d-md-none {{ site.default_icon }} {{ site .default_icon }}-{{ site.title_icon | default: site.powered_by.default }}" aria-hidden="true"></i>
27
27
  <!-- display name if there's enough space, else icon only -->
28
28
  <span class="d-none d-md-inline">
29
29
  {{ site.title | default: site.title }}
@@ -0,0 +1,167 @@
1
+ <!--
2
+ ===================================================================
3
+ FOOTER - Comprehensive Site Footer with Branding & Navigation
4
+ ===================================================================
5
+
6
+ File: footer.html
7
+ Path: _includes/footer.html
8
+ Purpose: Rich footer inspired by bashconsultants with Powered-by row,
9
+ branding/contact, quick links, social/RSS, subscribe form, and
10
+ policy links. Fully responsive with Bootstrap 5 utilities.
11
+
12
+ Template Logic:
13
+ - Top row: "Powered by" credits from site.powered_by
14
+ - Branding block: Site title, optional address/phone/email
15
+ - Quick links: Common pages (adjust as needed)
16
+ - Social links: site.links with icons + RSS feed
17
+ - Subscribe form: Non-functional placeholder endpoint (/subscribe)
18
+ - Bottom bar: Dynamic copyright year
19
+
20
+ Dependencies:
21
+ - site.powered_by: Framework and service credits
22
+ - site.links: Social media and affiliate links
23
+ - site.default_icon: Icon framework (Bootstrap Icons)
24
+ - site.data.ui-text: Internationalization support for RSS label
25
+ - Bootstrap 5 classes provided by the theme
26
+
27
+ Notes:
28
+ - Guard optional fields (address/phone/email) to avoid empty output
29
+ - Use relative_url for internal links to respect baseurl
30
+ ===================================================================
31
+ -->
32
+
33
+ <footer class="bd-footer container-xl border-top" role="contentinfo">
34
+ <!-- Powered by Row -->
35
+ <div class="container row my-3">
36
+ <ul class="nav col-sm justify-content-end list-unstyled d-flex align-items-center" aria-label="Powered by technologies">
37
+ <span class="align-start">
38
+ &copy; {{ site.time | date: "%Y" }} {{ site.name | default: site.title }} — Powered by:
39
+ </span>
40
+ {% for power in site.powered_by %}
41
+ <li class="btn align-items-end">
42
+ {% if power.url %}
43
+ <a href="{{ power.url }}" rel="nofollow">
44
+ <i class="{{ site.default_icon }} {{ power.icon | default: site.powered_by.default }}" aria-hidden="true"></i>
45
+ <span class="d-none d-md-inline">{{ power.name }}</span>
46
+ </a>
47
+ {% else %}
48
+ <span class="text-muted">
49
+ <i class="{{ site.default_icon }} {{ power.icon | default: site.powered_by.default }}" aria-hidden="true"></i>
50
+ <span class="d-none d-md-inline">{{ power.name }}</span>
51
+ </span>
52
+ {% endif %}
53
+ </li>
54
+ {% endfor %}
55
+ </ul>
56
+ </div>
57
+
58
+ <!-- Branding and Navigation Block -->
59
+ <div class="container row">
60
+ <div class="container bg-dark text-light py-5 rounded-3">
61
+ <div class="container">
62
+ <!-- Top: Site info + Quick Links + Social -->
63
+ <div class="row mb-4">
64
+ <!-- Site Info -->
65
+ <div class="col-12 col-md-6 col-lg-3 mb-3">
66
+ <h5 class="text-uppercase mb-3">{{ site.title }}</h5>
67
+ {% if site.address %}<p class="mb-1">{{ site.address }}</p>{% endif %}
68
+ {% if site.phone %}<p class="mb-1"><a href="tel:{{ site.phone }}" class="text-light text-decoration-none">{{ site.phone }}</a></p>{% endif %}
69
+ {% if site.email %}<p class="mb-0"><a href="mailto:{{ site.email }}" class="text-light text-decoration-none">{{ site.email }}</a></p>{% endif %}
70
+ </div>
71
+
72
+ <!-- Quick Links -->
73
+ <div class="col-12 col-md-6 col-lg-3 mb-3">
74
+ <h5 class="text-uppercase mb-3">Quick Links</h5>
75
+ <ul class="list-unstyled" aria-label="Footer quick links">
76
+ <li><a href="{{ '/' | relative_url }}" class="text-light text-decoration-none">Home</a></li>
77
+ <li><a href="{{ '/about' | relative_url }}" class="text-light text-decoration-none">About</a></li>
78
+ <li><a href="{{ '/services' | relative_url }}" class="text-light text-decoration-none">Services</a></li>
79
+ <li><a href="{{ '/blog' | relative_url }}" class="text-light text-decoration-none">Blog</a></li>
80
+ <li><a href="{{ '/contact' | relative_url }}" class="text-light text-decoration-none">Contact</a></li>
81
+ <li><a href="{{ '/sitemap.xml' | relative_url }}" class="text-light text-decoration-none">Sitemap (XML)</a></li>
82
+ </ul>
83
+ </div>
84
+
85
+ <!-- Latest Posts (dynamic) -->
86
+ {% assign posts_count = site.posts | size %}
87
+ {% if posts_count and posts_count > 0 %}
88
+ <div class="col-12 col-md-6 col-lg-3 mb-3">
89
+ <h5 class="text-uppercase mb-3">Latest Posts</h5>
90
+ <ul class="list-unstyled" aria-label="Latest posts">
91
+ {% for post in site.posts limit:3 %}
92
+ <li class="mb-1">
93
+ <a href="{{ post.url | relative_url }}" class="text-light text-decoration-none">{{ post.title }}</a>
94
+ </li>
95
+ {% endfor %}
96
+ </ul>
97
+ </div>
98
+ {% endif %}
99
+
100
+ <!-- Social & RSS -->
101
+ <div class="col-12 col-md-6 col-lg-3 mb-3">
102
+ <h5 class="text-uppercase mb-3">Follow Us</h5>
103
+ <ul class="list-inline mb-0" aria-label="Social links">
104
+ {% for link in site.links %}
105
+ {% if link.url %}
106
+ <li class="list-inline-item">
107
+ <a href="{{ link.url }}" rel="nofollow" class="text-light text-decoration-none">
108
+ <i class="{{ site.default_icon }} {{ link.icon | default: site.links.default }}" aria-hidden="true"></i>
109
+ <span class="d-none d-md-inline">{{ link.label }}</span>
110
+ </a>
111
+ </li>
112
+ {% endif %}
113
+ {% endfor %}
114
+ <li class="list-inline-item">
115
+ <a class="text-light text-decoration-none" href="{{ '/feed.xml' | relative_url }}">
116
+ <i class="{{ site.default_icon }} bi-rss" aria-hidden="true"></i>
117
+ <span class="d-none d-md-inline">{{ site.data.ui-text[site.locale].feed_label | default: "Feed" }}</span>
118
+ </a>
119
+ </li>
120
+ </ul>
121
+ </div>
122
+ </div>
123
+
124
+ <!-- Middle: Subscribe + Policies -->
125
+ <div class="row mb-4 align-items-center g-2">
126
+ <div class="col-md-8">
127
+ <form action="/subscribe" method="post" class="row g-2" aria-label="Subscribe form">
128
+ <div class="col-md-8">
129
+ <label for="footer-email" class="visually-hidden">Email</label>
130
+ <input type="email" name="email" id="footer-email" class="form-control" placeholder="Enter your email" required>
131
+ </div>
132
+ <div class="col-md-4">
133
+ <button type="submit" class="btn btn-primary w-100">Subscribe</button>
134
+ </div>
135
+ </form>
136
+ </div>
137
+ <div class="col-md-4 text-md-end">
138
+ <ul class="list-inline mb-0">
139
+ <li class="list-inline-item"><a href="{{ '/privacy-policy' | relative_url }}" class="text-light text-decoration-none">Privacy Policy</a></li>
140
+ <li class="list-inline-item"><a href="{{ '/terms-of-service' | relative_url }}" class="text-light text-decoration-none">Terms of Service</a></li>
141
+ </ul>
142
+ </div>
143
+ </div>
144
+
145
+ <!-- Bottom: Copyright -->
146
+ <div class="text-center">
147
+ <p class="mb-0">&copy; {{ site.time | date: "%Y" }} {{ site.title | default: site.name }}. All Rights Reserved.</p>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ </div>
152
+
153
+ <!-- Back to Top Button (controlled by assets/js/back-to-top.js) -->
154
+ <a
155
+ id="backToTopBtn"
156
+ href="#"
157
+ class="btn btn-primary position-fixed bottom-0 end-0 m-3"
158
+ aria-label="Back to top"
159
+ title="Back to top"
160
+ role="button"
161
+ style="display: none;"
162
+ >
163
+ <i class="{{ site.default_icon }} bi-arrow-up" aria-hidden="true"></i>
164
+ <span class="visually-hidden">Back to top</span>
165
+ </a>
166
+ </footer>
167
+