jekyll-theme-zer0 0.21.0 → 0.22.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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +86 -46
  4. data/_data/authors.yml +12 -3
  5. data/_data/features.yml +1 -1
  6. data/_data/glossary.yml +101 -0
  7. data/_data/navigation/docs.yml +12 -0
  8. data/_data/navigation/home.yml +2 -2
  9. data/_data/navigation/main.yml +2 -8
  10. data/_data/prompts.yml +184 -0
  11. data/_includes/components/author-eeat.html +133 -0
  12. data/_includes/components/cookie-consent.html +9 -9
  13. data/_includes/components/dev-shortcuts.html +36 -27
  14. data/_includes/components/env-detect.html +14 -0
  15. data/_includes/components/env-switcher.html +38 -16
  16. data/_includes/components/halfmoon.html +31 -20
  17. data/_includes/components/info-section.html +4 -3
  18. data/_includes/components/js-cdn.html +8 -15
  19. data/_includes/components/mermaid.html +13 -9
  20. data/_includes/components/powered-by.html +5 -3
  21. data/_includes/content/intro.html +64 -4
  22. data/_includes/content/jsonld-faq.html +47 -0
  23. data/_includes/content/jsonld-software.html +121 -0
  24. data/_includes/content/sitemap.html +2 -2
  25. data/_includes/core/branding.html +9 -7
  26. data/_includes/core/footer.html +12 -9
  27. data/_includes/core/head.html +17 -14
  28. data/_includes/core/header.html +33 -21
  29. data/_includes/navigation/navbar.html +130 -124
  30. data/_includes/navigation/sidebar-left.html +3 -3
  31. data/_includes/navigation/sidebar-right.html +4 -8
  32. data/_includes/search-data.json +1 -2
  33. data/_layouts/landing.html +8 -3
  34. data/_layouts/root.html +4 -4
  35. data/_layouts/sitemap-collection.html +20 -10
  36. data/_sass/core/_docs-layout.scss +756 -0
  37. data/_sass/core/_navbar.scss +522 -69
  38. data/_sass/core/_offcanvas-panels.scss +48 -0
  39. data/_sass/core/_syntax.scss +1 -51
  40. data/_sass/core/_theme.scss +2 -249
  41. data/_sass/core/_variables.scss +1 -54
  42. data/_sass/core/code-copy.scss +6 -6
  43. data/_sass/custom.scss +119 -133
  44. data/_sass/theme/_color-modes.scss +3 -0
  45. data/_sass/theme/_css-variables.scss +29 -0
  46. data/_sass/theme/_wizard-mode.scss +31 -0
  47. data/assets/css/custom.css +5 -120
  48. data/assets/css/main.scss +6 -2
  49. data/assets/css/stats.css +3 -0
  50. data/assets/css/theme-npm-entry.scss +6 -0
  51. data/assets/css/vendor/.gitkeep +0 -0
  52. data/assets/images/authors/bamr87.png +0 -0
  53. data/assets/js/auto-hide-nav.js +71 -20
  54. data/assets/js/color-modes.js +8 -2
  55. data/assets/js/halfmoon.js +8 -2
  56. data/assets/js/myScript.js +4 -12
  57. data/assets/js/navigation.js +174 -19
  58. data/assets/js/search-modal.js +50 -7
  59. data/assets/vendor/bootstrap/css/bootstrap.min.css +5 -0
  60. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +6 -0
  61. data/assets/vendor/bootstrap-icons/font/bootstrap-icons.css +2018 -0
  62. data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
  63. data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
  64. data/assets/vendor/font-awesome/css/all.min.css +9 -0
  65. data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  66. data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  67. data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  68. data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  69. data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  70. data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  71. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  72. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  73. data/assets/vendor/github-calendar/github-calendar-responsive.css +231 -0
  74. data/assets/vendor/github-calendar/github-calendar.min.js +240 -0
  75. data/assets/vendor/jquery/jquery-3.7.1.min.js +2 -0
  76. data/assets/vendor/mathjax/es5/adaptors/liteDOM.js +1 -0
  77. data/assets/vendor/mathjax/es5/core.js +1 -0
  78. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff +0 -0
  79. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff +0 -0
  80. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff +0 -0
  81. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff +0 -0
  82. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff +0 -0
  83. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff +0 -0
  84. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff +0 -0
  85. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff +0 -0
  86. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff +0 -0
  87. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff +0 -0
  88. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff +0 -0
  89. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff +0 -0
  90. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff +0 -0
  91. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff +0 -0
  92. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff +0 -0
  93. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff +0 -0
  94. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff +0 -0
  95. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff +0 -0
  96. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff +0 -0
  97. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff +0 -0
  98. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff +0 -0
  99. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff +0 -0
  100. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Zero.woff +0 -0
  101. data/assets/vendor/mathjax/es5/startup.js +1 -0
  102. data/assets/vendor/mathjax/es5/tex-mml-chtml.js +1 -0
  103. data/assets/vendor/mermaid/mermaid.min.js +2029 -0
  104. data/scripts/bin/build +12 -2
  105. data/scripts/lib/common.sh +55 -0
  106. data/scripts/lib/gem.sh +7 -0
  107. data/scripts/lib/validation.sh +9 -1
  108. data/scripts/lib/version.sh +41 -0
  109. data/scripts/test/integration/mermaid +1 -1
  110. data/scripts/vendor-install.sh +196 -0
  111. metadata +62 -3
  112. data/_sass/core/_docs.scss +0 -3219
@@ -36,7 +36,6 @@
36
36
  <!-- JAVASCRIPT LIBRARIES -->
37
37
  <!-- ================================ -->
38
38
  <!-- Custom theme JavaScript - Deferred for performance -->
39
- <script defer src="{{ '/assets/js/myScript.js' | relative_url }}"></script>
40
39
  <script defer src="{{ '/assets/js/auto-hide-nav.js' | relative_url }}"></script>
41
40
  <script defer src="{{ '/assets/js/back-to-top.js' | relative_url }}"></script>
42
41
  <script defer src="{{ '/assets/js/halfmoon.js' | relative_url }}"></script>
@@ -77,8 +76,8 @@
77
76
  });
78
77
  </script>
79
78
 
80
- <!-- MathJax - Mathematical notation rendering (async for performance) -->
81
- <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
79
+ <!-- MathJax - Mathematical notation rendering (async; bundled under assets/vendor) -->
80
+ <script id="MathJax-script" async src="{{ '/assets/vendor/mathjax/es5/tex-mml-chtml.js' | relative_url }}"></script>
82
81
 
83
82
  <!-- ================================ -->
84
83
  <!-- HTML DOCUMENT META DATA -->
@@ -110,9 +109,17 @@
110
109
  <meta itemprop="datePublished" content="{{ page.date | date_to_xmlschema }}">
111
110
  {% endif %}
112
111
  {% if page.last_modified_at %}
112
+ <meta itemprop="dateModified" content="{{ page.last_modified_at | date_to_xmlschema }}">
113
+ {% elsif page.lastmod %}
113
114
  <meta itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
114
115
  {% endif %}
115
116
 
117
+ <!-- JSON-LD SoftwareApplication schema (homepage only) -->
118
+ {% include content/jsonld-software.html %}
119
+
120
+ <!-- JSON-LD FAQ schema (pages with faq_items front matter) -->
121
+ {% include content/jsonld-faq.html %}
122
+
116
123
  <!-- ========================== -->
117
124
  <!-- ANALYTICS INTEGRATION -->
118
125
  <!-- ========================== -->
@@ -127,26 +134,22 @@
127
134
  <!-- ========================== -->
128
135
  <!-- BOOTSTRAP 5 FRAMEWORK -->
129
136
  <!-- ========================== -->
130
- <!-- Bootstrap 5.3.3 - Primary CSS framework via CDN for performance -->
131
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
132
-
133
- <!-- Local Bootstrap Installation - Alternative for offline development -->
134
- <!-- <script src="/assets/js/bootstrap.js"></script> -->
137
+ <!-- Bootstrap 5.3.3 - bundled locally (GitHub Pages–safe; refresh via scripts/vendor-install.sh) -->
138
+ <link href="{{ '/assets/vendor/bootstrap/css/bootstrap.min.css' | relative_url }}" rel="stylesheet">
135
139
 
136
140
  <!-- ========================== -->
137
141
  <!-- ICON LIBRARIES -->
138
142
  <!-- ========================== -->
139
- <!-- Bootstrap Icons 1.10.3 - Complete icon set for UI elements -->
140
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css">
143
+ <!-- Bootstrap Icons (bundled with theme; fonts use relative paths in CSS) -->
144
+ <link rel="stylesheet" href="{{ '/assets/vendor/bootstrap-icons/font/bootstrap-icons.css' | relative_url }}">
141
145
 
142
146
  <!-- ========================== -->
143
147
  <!-- CUSTOM THEME STYLES -->
144
148
  <!-- ========================== -->
145
- <!-- Primary theme stylesheet - Core styling and layout -->
149
+ <!-- Primary theme stylesheet - Core styling and layout (SCSS pipeline) -->
146
150
  <link rel="stylesheet" href="{{ '/assets/css/main.css' | relative_url }}">
147
151
 
148
- <!-- Custom CSS overrides - Theme customizations and tweaks -->
149
- <link rel="stylesheet" href="{{'/assets/css/custom.css' | relative_url }}">
152
+ <!-- Optional fork overrides: add assets/css/user-overrides.css locally if needed (not shipped by default). -->
150
153
 
151
154
  <!-- Statistics page specific styles -->
152
155
  {% if page.layout == 'stats' %}
@@ -161,4 +164,4 @@
161
164
 
162
165
  <!-- Docs CSS - Alternative stylesheet, currently disabled due to scroll spy issues -->
163
166
  <!-- TODO: Replace with compiled Sass when scroll spy functionality is fixed -->
164
- <!-- <link rel="stylesheet" href="/assets/css/docs.css"> -->
167
+ <!-- Optional docs.css link removed; use _sass/core/_docs-layout.scss → main.css -->
@@ -42,7 +42,7 @@
42
42
  Skip to main content
43
43
  </a>
44
44
 
45
- <header id="navbar" class="container-fluid text-center fixed-top" role="navigation">
45
+ <header id="navbar" class="container-fluid text-center fixed-top" role="banner">
46
46
 
47
47
  <!-- ================================ -->
48
48
  <!-- TOP NAVIGATION BAR -->
@@ -53,21 +53,29 @@
53
53
  <!-- PROGRESS BAR INDICATOR -->
54
54
  <!-- ========================== -->
55
55
  <!-- Fixed position progress bar for page loading feedback -->
56
- <div class="nanobar" id="top-progress-bar" style="position: fixed;">
56
+ <div class="nanobar" id="top-progress-bar" style="position: fixed;" role="progressbar" aria-label="Page loading progress" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
57
57
  <div class="bar"></div>
58
58
  </div>
59
59
 
60
60
  <!-- ========================== -->
61
61
  <!-- MAIN NAVIGATION CONTAINER -->
62
62
  <!-- ========================== -->
63
- <nav class="container-xl order-2 order-lg-1 grid gap-1 navbar-main">
63
+ <nav class="container-xl order-2 order-lg-1 d-flex align-items-center gap-1 flex-wrap flex-lg-nowrap navbar-main" aria-label="Primary navigation">
64
+
65
+ <!-- Leading cluster: sidebar toggle + brand + titles (grid column 1 on lg+) -->
66
+ <div class="navbar-main-start d-flex align-items-center gap-1 gap-lg-2 min-w-0 flex-shrink-1">
64
67
 
65
68
  <!-- ========================== -->
66
69
  <!-- MOBILE MENU CONTROLS -->
67
70
  <!-- ========================== -->
68
71
 
69
- <!-- Left Sidebar Toggle - Mobile view only -->
70
- {% assign sidebar_nav = page.sidebar.nav | default: nil %}
72
+ <!-- Left Sidebar Toggle - Mobile view only (omit when page.sidebar: false — matches default layout aside) -->
73
+ {% assign sidebar_nav = nil %}
74
+ {% if page.sidebar != false %}
75
+ {% if page.sidebar and page.sidebar.nav %}
76
+ {% assign sidebar_nav = page.sidebar.nav %}
77
+ {% endif %}
78
+ {% endif %}
71
79
  {% assign sidebar_has_content = false %}
72
80
  {% if sidebar_nav %}
73
81
  {% if sidebar_nav == "auto" or sidebar_nav == "categories" %}
@@ -84,8 +92,9 @@
84
92
  data-bs-toggle="offcanvas"
85
93
  data-bs-target="#bdSidebar"
86
94
  aria-controls="bdSidebar"
87
- aria-label="Toggle sidebar navigation">
88
- <span class="bi bi-list"></span>
95
+ aria-label="Toggle sidebar navigation"
96
+ aria-expanded="false">
97
+ <span class="bi bi-list" aria-hidden="true"></span>
89
98
  </button>
90
99
  </div>
91
100
  {% endif %}
@@ -95,9 +104,9 @@
95
104
  <!-- ========================== -->
96
105
  <div class="navbar-brand-group d-inline-flex align-items-center gap-2">
97
106
  <!-- Home Navigation Button (Desktop only) -->
98
- <div class="navbar-home-links d-none d-lg-inline-flex">
107
+ <div class="navbar-home-links d-none d-lg-inline-flex" role="navigation" aria-label="Quick navigation">
99
108
  {%- for home in site.data.navigation.home -%}
100
- <a class="btn" href="{{ home.url | relative_url }}" aria-label="{{ home.title }}" title="{{ home.title }}">
109
+ <a class="btn" href="{{ home.url | relative_url }}" aria-label="{{ home.title }}" title="{{ home.title }}" {% if home.url == page.url %}aria-current="page"{% endif %}>
101
110
  <i class="{{ site.default_icon}} {{ home.icon }}"></i>
102
111
  </a>
103
112
  {% endfor %}
@@ -106,8 +115,8 @@
106
115
  <!-- Brand Logo Link to Root -->
107
116
  <!-- Logo path configured in _config.yml -->
108
117
  {% capture logo_path %}{{ site.logo }}{% endcapture %}
109
- <a class="navbar-brand" href="{{ site.baseurl }}/" aria-label="Home">
110
- <img src="{{ logo_path | relative_url }}" alt="Logo" width="30" height="30">
118
+ <a class="navbar-brand" href="{{ site.baseurl }}/" aria-label="Home - {{ site.title }}" {% if page.url == '/' %}aria-current="page"{% endif %}>
119
+ <img src="{{ logo_path | relative_url }}" alt="{{ site.title }} logo" width="30" height="30">
111
120
  </a>
112
121
  </div>
113
122
 
@@ -116,6 +125,8 @@
116
125
  <!-- ========================== -->
117
126
  <!-- Site title and subtitle display -->
118
127
  {% include core/branding.html %}
128
+
129
+ </div>
119
130
 
120
131
  <!-- ========================== -->
121
132
  <!-- MAIN NAVIGATION MENU -->
@@ -126,18 +137,17 @@
126
137
  <!-- ========================== -->
127
138
  <!-- UTILITY CONTROLS -->
128
139
  <!-- ========================== -->
129
- <div class="navbar-utility-controls d-flex align-items-center">
140
+ <div class="navbar-utility-controls d-flex align-items-center" role="group" aria-label="Utility controls">
130
141
  <!-- Search Modal Toggle -->
131
142
  <button
132
143
  class="btn nav-search-button"
133
144
  type="button"
134
- data-bs-toggle="modal"
135
- data-bs-target="#siteSearchModal"
136
145
  data-search-toggle
137
146
  aria-label="Open search"
138
- title="Search"
147
+ aria-haspopup="dialog"
148
+ title="Search site content"
139
149
  >
140
- <i class="{{site.default_icon}} bi-search"></i>
150
+ <i class="{{site.default_icon}} bi-search" aria-hidden="true"></i>
141
151
  <span class="nav-link-text d-none d-xl-inline ms-1">Search</span>
142
152
  </button>
143
153
 
@@ -147,10 +157,11 @@
147
157
  type="button"
148
158
  data-bs-toggle="modal"
149
159
  data-bs-target="#info-section"
150
- aria-label="Settings"
151
- title="Settings"
160
+ aria-label="Open settings"
161
+ aria-haspopup="dialog"
162
+ title="Site settings and information"
152
163
  >
153
- <i class="{{site.default_icon}} bi-gear"></i>
164
+ <i class="{{site.default_icon}} bi-gear" aria-hidden="true"></i>
154
165
  </button>
155
166
 
156
167
  <!-- Navigation Menu Toggle - Mobile view -->
@@ -160,8 +171,9 @@
160
171
  data-bs-toggle="offcanvas"
161
172
  data-bs-target="#bdNavbar"
162
173
  aria-controls="bdNavbar"
163
- aria-label="Toggle navigation">
164
- <span class="bi bi-three-dots"></span>
174
+ aria-label="Toggle main navigation"
175
+ aria-expanded="false">
176
+ <span class="bi bi-three-dots" aria-hidden="true"></span>
165
177
  </button>
166
178
  </div>
167
179
  </div>
@@ -1,125 +1,131 @@
1
- <!--
2
- file: navbar.html
3
- path: /includes/navbar.html
4
- includes:
5
- purpose: Offcanvas main navigation following Bootstrap 5 best practices
6
- with hover-activated dropdowns for desktop
7
- -->
8
-
9
- <!-- Navigation Links - Offcanvas -->
10
- <div class="offcanvas offcanvas-end col-lg-2" tabindex="-1" id="bdNavbar" aria-labelledby="mainNavOffcanvasLabel">
11
-
12
- <!-- Main Navigation Header - Offcanvas -->
13
- <div class="offcanvas-header border-bottom">
14
- <h5 class="offcanvas-title" id="mainNavOffcanvasLabel">Main Navigation</h5>
15
- <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdNavbar"></button>
16
- </div>
17
-
18
- <!-- Main Navigation Body - Offcanvas -->
19
- <div class="offcanvas-body">
20
- <ul class="navbar-nav justify-content-lg-center text-start flex-grow-1">
21
- <li class="nav-item d-lg-none">
22
- <a class="nav-link" href="{{ '/' | relative_url }}">
23
- <i class="{{site.default_icon}} bi-house me-2"></i>
24
- Home
25
- </a>
26
- </li>
27
- {%- for link in site.data.navigation.main -%}
28
- {%- assign has_children = link.children and link.children.size > 0 -%}
29
-
30
- {%- if has_children -%}
31
- <li class="nav-item dropdown d-flex align-items-center nav-hover-dropdown">
32
- <!-- Parent link navigates directly -->
33
- <a
34
- class="nav-link"
35
- href="{{ link.url | relative_url }}"
36
- {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
37
- title="{{ link.title }}"
38
- >
39
- {%- if link.icon -%}
40
- <i class="{{site.default_icon}} {{ link.icon }}"></i>
41
- {%- endif -%}
42
- <span class="nav-link-text">{{ link.title }}</span>
43
- </a>
44
-
45
- <!-- Split toggle opens the dropdown (click on mobile, hover on desktop) -->
46
- <a
47
- class="nav-link dropdown-toggle dropdown-toggle-split ms-1 px-1"
48
- href="#"
49
- id="dropdown-{{ link.title | slugify }}"
50
- role="button"
51
- data-bs-toggle="dropdown"
52
- data-bs-auto-close="outside"
53
- aria-expanded="false"
54
- aria-label="Toggle {{ link.title }} menu"
55
- >
56
- <span class="visually-hidden">Toggle dropdown</span>
57
- </a>
58
-
59
- <ul class="dropdown-menu dropdown-menu-start" aria-labelledby="dropdown-{{ link.title | slugify }}">
60
- {%- for child in link.children -%}
61
- <li>
62
- <a
63
- class="dropdown-item"
64
- href="{{ child.url | relative_url }}"
65
- {%- if child.url == page.url -%} aria-current="page"{%- endif -%}
66
- >
67
- {%- if child.icon -%}
68
- <i class="{{site.default_icon}} {{ child.icon }} me-2"></i>
69
- {%- endif -%}
70
- {{ child.title }}
71
- </a>
72
- </li>
73
- {%- endfor -%}
74
- </ul>
75
- </li>
76
- {%- else -%}
77
- <li class="nav-item">
78
- <a
79
- class="nav-link"
80
- href="{{ link.url | relative_url }}"
81
- {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
82
- title="{{ link.title }}"
83
- >
84
- {%- if link.icon -%}
85
- <i class="{{site.default_icon}} {{ link.icon }}"></i>
86
- {%- endif -%}
87
- <span class="nav-link-text">{{ link.title }}</span>
88
- </a>
89
- </li>
90
- {%- endif -%}
91
- {%- endfor -%}
92
- <li class="nav-item d-lg-none">
93
- <button
94
- class="nav-link btn btn-link text-start w-100"
95
- type="button"
96
- data-bs-toggle="modal"
97
- data-bs-target="#siteSearchModal"
98
- data-search-toggle
99
- aria-label="Open search"
100
- >
101
- <i class="{{site.default_icon}} bi-search me-2"></i>
102
- Search
103
- </button>
104
- </li>
105
- <li class="nav-item d-lg-none">
106
- <button
107
- class="nav-link btn btn-link text-start w-100"
108
- type="button"
109
- data-bs-toggle="modal"
110
- data-bs-target="#info-section"
111
- aria-controls="info-section"
112
- >
113
- <i class="{{site.default_icon}} bi-gear me-2"></i>
114
- Settings
115
- </button>
116
- </li>
117
- </ul>
118
- </div>
119
- </div>
120
-
121
- <!--
122
- Navigation styles are now in _sass/core/_navbar.scss
123
- Navigation scripts are now in assets/js/navigation.js
124
- These are loaded automatically via the theme's asset pipeline
1
+ <!--
2
+ file: navbar.html
3
+ path: /includes/navbar.html
4
+ includes:
5
+ purpose: Offcanvas main navigation following Bootstrap 5 best practices
6
+ with hover-activated dropdowns for desktop and accessible interactions
7
+ -->
8
+
9
+ <!-- Navigation Links - Offcanvas -->
10
+ <div class="offcanvas offcanvas-end col-lg-2" tabindex="-1" id="bdNavbar" aria-labelledby="mainNavOffcanvasLabel" aria-modal="true" role="dialog">
11
+
12
+ <!-- Main Navigation Header - Offcanvas -->
13
+ <div class="offcanvas-header border-bottom">
14
+ <h2 class="offcanvas-title h5 mb-0" id="mainNavOffcanvasLabel">Main Navigation</h2>
15
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close navigation menu" data-bs-target="#bdNavbar"></button>
16
+ </div>
17
+
18
+ <!-- Main Navigation Body - Offcanvas -->
19
+ <div class="offcanvas-body">
20
+ <!-- Desktop: width is the grid middle track; labels ellipsis or icon-only via container query -->
21
+ <div class="bd-navbar-nav-viewport">
22
+ <ul class="navbar-nav justify-content-lg-center text-start flex-grow-1" role="menubar">
23
+ <li class="nav-item d-lg-none" role="none">
24
+ <a class="nav-link" href="{{ '/' | relative_url }}" role="menuitem" {% if page.url == '/' %}aria-current="page"{% endif %}>
25
+ <i class="{{site.default_icon}} bi-house me-2" aria-hidden="true"></i>
26
+ Home
27
+ </a>
28
+ </li>
29
+ {%- for link in site.data.navigation.main -%}
30
+ {%- assign has_children = link.children and link.children.size > 0 -%}
31
+
32
+ {%- if has_children -%}
33
+ <li class="nav-item dropdown d-flex align-items-center nav-hover-dropdown" role="none">
34
+ <!-- Parent link navigates directly -->
35
+ <a
36
+ class="nav-link"
37
+ href="{{ link.url | relative_url }}"
38
+ role="menuitem"
39
+ {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
40
+ title="{{ link.title }}"
41
+ >
42
+ {%- if link.icon -%}
43
+ <i class="{{site.default_icon}} {{ link.icon }}" aria-hidden="true"></i>
44
+ {%- endif -%}
45
+ <span class="nav-link-text">{{ link.title }}</span>
46
+ </a>
47
+
48
+ <!-- Split toggle opens the dropdown (click on mobile, hover on desktop) -->
49
+ <!-- Note: No data-bs-toggle="dropdown" custom JS handles all interactions
50
+ to avoid Bootstrap's native handler conflicting with our toggle logic -->
51
+ <button
52
+ class="nav-link dropdown-toggle dropdown-toggle-split ms-1 px-1 btn"
53
+ type="button"
54
+ id="dropdown-{{ link.title | slugify }}"
55
+ aria-expanded="false"
56
+ aria-label="Toggle {{ link.title }} submenu"
57
+ aria-haspopup="true"
58
+ >
59
+ <span class="visually-hidden">Toggle {{ link.title }} submenu</span>
60
+ </button>
61
+
62
+ <ul class="dropdown-menu dropdown-menu-start" aria-labelledby="dropdown-{{ link.title | slugify }}" role="menu">
63
+ {%- for child in link.children -%}
64
+ <li role="none">
65
+ <a
66
+ class="dropdown-item"
67
+ href="{{ child.url | relative_url }}"
68
+ role="menuitem"
69
+ {%- if child.url == page.url -%} aria-current="page"{%- endif -%}
70
+ >
71
+ {%- if child.icon -%}
72
+ <i class="{{site.default_icon}} {{ child.icon }} me-2" aria-hidden="true"></i>
73
+ {%- endif -%}
74
+ {{ child.title }}
75
+ </a>
76
+ </li>
77
+ {%- endfor -%}
78
+ </ul>
79
+ </li>
80
+ {%- else -%}
81
+ <li class="nav-item" role="none">
82
+ <a
83
+ class="nav-link"
84
+ href="{{ link.url | relative_url }}"
85
+ role="menuitem"
86
+ {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
87
+ title="{{ link.title }}"
88
+ >
89
+ {%- if link.icon -%}
90
+ <i class="{{site.default_icon}} {{ link.icon }}" aria-hidden="true"></i>
91
+ {%- endif -%}
92
+ <span class="nav-link-text">{{ link.title }}</span>
93
+ </a>
94
+ </li>
95
+ {%- endif -%}
96
+ {%- endfor -%}
97
+ <li class="nav-item d-lg-none" role="none">
98
+ <button
99
+ class="nav-link btn btn-link text-start w-100"
100
+ type="button"
101
+ data-search-toggle
102
+ aria-label="Open search"
103
+ aria-haspopup="dialog"
104
+ >
105
+ <i class="{{site.default_icon}} bi-search me-2" aria-hidden="true"></i>
106
+ Search
107
+ </button>
108
+ </li>
109
+ <li class="nav-item d-lg-none" role="none">
110
+ <button
111
+ class="nav-link btn btn-link text-start w-100"
112
+ type="button"
113
+ data-bs-toggle="modal"
114
+ data-bs-target="#info-section"
115
+ aria-controls="info-section"
116
+ aria-haspopup="dialog"
117
+ >
118
+ <i class="{{site.default_icon}} bi-gear me-2" aria-hidden="true"></i>
119
+ Settings
120
+ </button>
121
+ </li>
122
+ </ul>
123
+ </div>
124
+ </div>
125
+ </div>
126
+
127
+ <!--
128
+ Navigation styles are now in _sass/core/_navbar.scss
129
+ Navigation scripts are now in assets/js/navigation.js
130
+ These are loaded automatically via the theme's asset pipeline
125
131
  -->
@@ -37,9 +37,9 @@
37
37
  <!-- SIDEBAR HEADER -->
38
38
  <!-- ========================== -->
39
39
  <!-- Mobile-only header with close button -->
40
- <div class="offcanvas-header border-bottom">
41
- <h5 class="offcanvas-title" id="bdSidebarOffcanvasLabel">Browse docs</h5>
42
- <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdSidebar"></button>
40
+ <div class="offcanvas-header">
41
+ <h2 class="offcanvas-title h5 mb-0" id="bdSidebarOffcanvasLabel">Browse docs</h2>
42
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close documentation sidebar" data-bs-target="#bdSidebar"></button>
43
43
  </div>
44
44
 
45
45
  <!-- ========================== -->
@@ -6,14 +6,13 @@
6
6
 
7
7
  <!-- TOC button in mobile view - Floating Action Button pattern -->
8
8
  <!-- Positioned above back-to-top button to prevent overlap -->
9
- <div class="d-lg-none position-fixed bd-toc-fab" style="bottom: 90px; right: 20px; z-index: 1030;">
9
+ <div class="d-lg-none position-fixed bd-toc-fab">
10
10
  <button class="btn btn-primary rounded-circle shadow-lg bd-toc-toggle"
11
11
  type="button"
12
12
  data-bs-toggle="offcanvas"
13
13
  data-bs-target="#tocContents"
14
14
  aria-controls="tocContents"
15
- aria-label="Toggle Table of Contents"
16
- style="width: 56px; height: 56px;">
15
+ aria-label="Toggle Table of Contents">
17
16
  <i class="bi bi-list-ul fs-5"></i>
18
17
  </button>
19
18
  </div>
@@ -21,8 +20,8 @@
21
20
  <!-- Right sidebar container -->
22
21
  <div class="offcanvas-lg offcanvas-end" tabindex="-1" id="tocContents" aria-labelledby="tocLabel">
23
22
  <div class="offcanvas-header">
24
- <h5 class="offcanvas-title" id="tocLabel">Table of Contents</h5>
25
- <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#tocContents"></button>
23
+ <h2 class="offcanvas-title h5 mb-0" id="tocLabel">Table of Contents</h2>
24
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close table of contents" data-bs-target="#tocContents"></button>
26
25
  </div>
27
26
  <div class="offcanvas-body">
28
27
  <!-- Table of contents -->
@@ -35,9 +34,6 @@
35
34
  </strong>
36
35
  </div>
37
36
 
38
- <!-- TOC list -->
39
-
40
- <!-- TOC list -->
41
37
  {% include content/toc.html sanitize=true html=content h_min=1 h_max=3 class="list-group-flush" item_class="list-group-item" anchor_class="" skip_no_ids=true %}
42
38
  </nav>
43
39
  </div>
@@ -1,8 +1,7 @@
1
1
  [
2
2
  {%- assign search_pages = site.pages | where_exp: "item", "item.title" -%}
3
- {%- assign search_posts = site.posts -%}
4
3
  {%- assign search_docs = site.documents -%}
5
- {%- assign search_items = search_pages | concat: search_posts | concat: search_docs -%}
4
+ {%- assign search_items = search_pages | concat: search_docs -%}
6
5
  {%- assign content_limit = site.search.content_length | default: 1000 -%}
7
6
  {%- assign first = true -%}
8
7
  {%- for item in search_items -%}
@@ -50,7 +50,7 @@ layout: root
50
50
  <div class="bg-primary text-white position-relative overflow-hidden">
51
51
  <div class="container-xl py-5 px-4 px-md-5">
52
52
  <div class="row align-items-center min-vh-50 g-4 g-lg-5">
53
- <div class="col-lg-6 order-2 order-lg-1">
53
+ <div class="col-lg-6 order-1">
54
54
  <h1 class="display-4 fw-bold mb-3 animate-on-scroll">{{ page.title }}</h1>
55
55
  <p class="lead mb-4 animate-on-scroll" style="animation-delay: 0.1s;">{{ page.description }}</p>
56
56
  <div class="d-flex flex-column flex-md-row gap-3 animate-on-scroll" style="animation-delay: 0.2s;">
@@ -65,7 +65,7 @@ layout: root
65
65
  </a>
66
66
  </div>
67
67
  </div>
68
- <div class="col-lg-6 text-center order-1 order-lg-2">
68
+ <div class="col-lg-6 text-center order-2">
69
69
  {% if page.hero_image %}
70
70
  <img src="{{ page.hero_image }}" alt="{{ page.title }}" class="img-fluid rounded shadow-lg animate-on-scroll" loading="eager" style="animation-delay: 0.3s;">
71
71
  {% else %}
@@ -151,4 +151,9 @@ layout: root
151
151
  {% include landing/landing-install-cards.html %}
152
152
  </div>
153
153
  </div>
154
- </div>
154
+ </div>
155
+
156
+ <!-- ================================ -->
157
+ <!-- AUTHOR / E-E-A-T SECTION -->
158
+ <!-- ================================ -->
159
+ {% include components/author-eeat.html %}
data/_layouts/root.html CHANGED
@@ -51,7 +51,7 @@
51
51
  <!-- ============================================== -->
52
52
 
53
53
  <!-- Inline SVG symbols for consistent iconography throughout the site -->
54
- {% include components/svg.html %}
54
+ {% include_cached components/svg.html %}
55
55
 
56
56
  <!-- Google Tag Manager body code for analytics (if configured) -->
57
57
  <!-- Note: Currently commented out - uncomment when GTM is needed -->
@@ -60,7 +60,7 @@
60
60
  {% include core/header.html %}
61
61
 
62
62
  <!-- Search modal (site-wide) -->
63
- {% include components/search-modal.html %}
63
+ {% include_cached components/search-modal.html %}
64
64
 
65
65
  <!-- Site-wide information banner or announcement section -->
66
66
  {% include components/info-section.html %}
@@ -81,7 +81,7 @@
81
81
  {%- include core/footer.html -%}
82
82
 
83
83
  <!-- Privacy-compliant cookie consent banner -->
84
- {%- include components/cookie-consent.html -%}
84
+ {%- include_cached components/cookie-consent.html -%}
85
85
 
86
86
  <!-- JavaScript dependencies and custom scripts -->
87
87
  <div>
@@ -89,7 +89,7 @@
89
89
  <!-- Note: Currently commented out - uncomment when search is implemented -->
90
90
 
91
91
  <!-- External JavaScript libraries and custom scripts -->
92
- {% include components/js-cdn.html %}
92
+ {% include_cached components/js-cdn.html %}
93
93
  </div>
94
94
 
95
95
  <!-- Analytics Integration -->