jekyll-theme-zer0 1.2.0 → 1.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 557e14c1256d2eb630827e7136486ff6ecbcd99f77f96b1ca2ae0909c8cbd818
4
- data.tar.gz: 9d3dc46191a9085f004b5790110aa9ef24b030b8c830fcc6adc06ed0f3317367
3
+ metadata.gz: 492ac103c8adea1b4edaf2cf925f5a5e02d661e522907dec95cbf08ec0ab0ef6
4
+ data.tar.gz: 5efc803b2288fb9036165becc816e2b1f78cfa2e5aa62368049463e4eb7891c4
5
5
  SHA512:
6
- metadata.gz: 9df47e33dbcd2696507527b20a907e081f55f94aa6ad9f1f7dfd517c80549fc87dc96ad0d10d7fa761b1a02b71507465e4c8b130ceb556db54736f1e982449aa
7
- data.tar.gz: '039d73f1c388b0c0c1f66f212dcd6abf83a73916690baaecc1127a3c0911da5cb529f841998f68c55a0a280b8468da65bfee6e2d6ac0352d3b97def42ab15e64'
6
+ metadata.gz: 015f1f284b8129ae2788be7be74386818bdcd965b84d24aa4ba600fde13a91e4de2c211c068a28a69a959d30b18946b39cd4677fc21b1e8b2a44f59adf061edb
7
+ data.tar.gz: 06525dbbc0bea7d545293865e69b7c2f95352e213b3eee20db2a966f81f217d2ad88b02587f15f48b8e3d6f7a0adafb57978c5455638fd1a29fe79b980ca15ce
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.2.1] - 2026-04-22
4
+
5
+ ### Changed
6
+ - Version bump: patch release
7
+
8
+ ### Commits in this release
9
+ - 5c04e62 fix(footer,welcome,info): eliminate broken links on bare-minimum sites
10
+
11
+
3
12
  ## [1.2.0] - 2026-04-22
4
13
 
5
14
  ### Changed
@@ -37,6 +46,37 @@
37
46
  `Your Site Title`, `My Awesome Site`, `Welcome`, `Untitled`, or empty).
38
47
 
39
48
  ### Fixed
49
+ - **Footer Quick Links no longer 404 on bare-minimum sites.**
50
+ `_includes/core/footer.html` previously hard-coded links to
51
+ `/about/`, `/services/`, `/news/`, `/contact/`, `/privacy-policy`, and
52
+ `/terms-of-service` — none of which exist in a 3-file remote-theme
53
+ consumer. Quick Links are now resolved in this order:
54
+ 1. `site.footer_quick_links` (array of `{label, url}`) — explicit override
55
+ 2. Auto-detection: each candidate link only renders if the target page
56
+ exists in `site.html_pages`
57
+ 3. Fallback to `Home` + `Sitemap (XML)` only.
58
+ Privacy Policy / Terms of Service links use the same existence check and
59
+ optionally read from `site.privacy_policy_url` / `site.terms_of_service_url`.
60
+ - **Welcome layout external links now point to existing README anchors.**
61
+ The "Next steps" cards in `_layouts/welcome.html` linked to
62
+ `#content-creation` and `#customisation`, which don't exist in the theme
63
+ README. They now point to `README.md#-quick-start` and
64
+ `README.md#-key-features` respectively.
65
+ - **Theme info admin links are conditional.**
66
+ `_includes/components/info-section.html` previously rendered Admin
67
+ Dashboard links to `/about/config/`, `/about/settings/theme/`,
68
+ `/about/settings/navigation/`, and `/about/settings/environment/`
69
+ unconditionally — guaranteed 404s on bare-minimum sites. The links and
70
+ surrounding section now only render when the corresponding page exists.
71
+ - **Source Code shortcuts skip GitHub buttons when repository is unknown.**
72
+ `_includes/components/dev-shortcuts.html` rendered `https://github.com//blob//`
73
+ URLs when `site.repository` and `site.branch` were empty (typical on bare
74
+ consumer sites). It now hides the GitHub-based buttons and shows a hint
75
+ to set `repository: USER/REPO` in `_config.yml`.
76
+ - **Cookie-consent privacy link is conditional.** The "Learn more in our
77
+ Privacy Policy" anchor in `_includes/components/cookie-consent.html` only
78
+ renders if a `/privacy-policy/` page exists or `site.privacy_policy_url` is
79
+ configured.
40
80
  - **Setup banner link.** `_includes/components/setup-banner.html` no longer
41
81
  points at the non-existent `/404.html`; it now links to
42
82
  `/#setup-wizard`, which is provided by the new welcome layout.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  title: zer0-mistakes
3
3
  sub-title: AI-Native Jekyll Theme
4
4
  description: AI-native Jekyll theme for GitHub Pages — Docker-first development, AI-powered installation, multi-agent integration (Copilot, Codex, Cursor, Claude), AI preview-image generation, and AIEO content optimization with Bootstrap 5.3.
5
- version: 1.2.0
5
+ version: 1.2.1
6
6
  layout: landing
7
7
  tags:
8
8
  - jekyll
@@ -20,7 +20,7 @@ categories:
20
20
  - bootstrap
21
21
  - ai-tooling
22
22
  created: 2024-02-10T23:51:11.480Z
23
- lastmod: 2026-04-22T02:41:59.000Z
23
+ lastmod: 2026-04-22T03:05:26.000Z
24
24
  draft: false
25
25
  permalink: /
26
26
  slug: zer0
@@ -1114,7 +1114,7 @@ git push origin feature/awesome-feature
1114
1114
 
1115
1115
  | Metric | Value |
1116
1116
  |--------|-------|
1117
- | **Current Version** | 1.2.0 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
1117
+ | **Current Version** | 1.2.1 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
1118
1118
  | **Documented Features** | 43 ([Feature Registry](https://github.com/bamr87/zer0-mistakes/blob/main/_data/features.yml)) |
1119
1119
  | **Setup Time** | 2-5 minutes ([install.sh benchmarks](https://github.com/bamr87/zer0-mistakes/blob/main/install.sh)) |
1120
1120
  | **Documentation Pages** | 70+ ([browse docs](/pages/)) |
@@ -1165,6 +1165,6 @@ And these AI partners that make zer0-mistakes truly AI-native:
1165
1165
 
1166
1166
  **Built with ❤️ — and a little help from our AI partners — for the Jekyll community**
1167
1167
 
1168
- **v1.2.0** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md) • [AI Agent Guide](AGENTS.md)
1168
+ **v1.2.1** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md) • [AI Agent Guide](AGENTS.md)
1169
1169
 
1170
1170
 
@@ -59,7 +59,11 @@ Configuration: Uses site.posthog settings from _config.yml
59
59
  </p>
60
60
  <p class="mb-2 mb-lg-0 small text-white-50">
61
61
  This website uses cookies and similar technologies to enhance your browsing experience, analyze traffic, and provide personalized content.
62
- <a href="{{ '/privacy-policy/' | relative_url }}" class="text-white text-decoration-underline">Learn more in our Privacy Policy</a>.
62
+ {% assign _pp = site.html_pages | where: "url", "/privacy-policy/" | first %}
63
+ {% unless _pp %}{% assign _pp = site.html_pages | where: "url", "/privacy-policy" | first %}{% endunless %}
64
+ {% if _pp or site.privacy_policy_url %}
65
+ <a href="{{ site.privacy_policy_url | default: '/privacy-policy/' | relative_url }}" class="text-white text-decoration-underline">Learn more in our Privacy Policy</a>.
66
+ {% endif %}
63
67
  </p>
64
68
  </div>
65
69
  <div class="col-12 col-lg-4">
@@ -33,6 +33,11 @@
33
33
  <div class="dev-shortcuts">
34
34
  <div class="d-flex flex-column gap-2">
35
35
 
36
+ {% comment %} Skip all GitHub-based shortcuts on bare/unconfigured sites where
37
+ site.repository or site.branch are empty (otherwise we render
38
+ https://github.com//blob//path → 404). {% endcomment %}
39
+ {% if site.repository and site.branch %}
40
+
36
41
  <!-- Button Group (section title is the parent h6 in info-section.html) -->
37
42
  <div class="btn-group-vertical" role="group" aria-label="Source code shortcuts">
38
43
 
@@ -109,5 +114,13 @@
109
114
 
110
115
  </div>
111
116
 
117
+ {% else %}
118
+ <p class="small text-body-secondary mb-0">
119
+ <i class="bi bi-info-circle me-1"></i>
120
+ Set <code>repository: USER/REPO</code> in your <code>_config.yml</code>
121
+ to enable source-code shortcuts.
122
+ </p>
123
+ {% endif %}
124
+
112
125
  </div>
113
126
  </div>
@@ -108,35 +108,51 @@
108
108
  </div>
109
109
  </div>
110
110
 
111
- <!-- Admin Quick Links -->
111
+ <!-- Admin Quick Links — only render links to pages that actually exist
112
+ in the build (prevents 404s on bare-minimum / remote-theme sites
113
+ that haven't created the admin pages). -->
114
+ {% assign _cfg_page = site.html_pages | where: "url", "/about/config/" | first %}
115
+ {% assign _theme_page = site.html_pages | where: "url", "/about/settings/theme/" | first %}
116
+ {% assign _nav_page = site.html_pages | where: "url", "/about/settings/navigation/" | first %}
117
+ {% if _cfg_page or _theme_page or _nav_page %}
112
118
  <div class="mb-3">
113
119
  <h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
114
120
  <i class="bi bi-speedometer2 me-1"></i>Admin Dashboard
115
121
  </h6>
116
122
  <div class="list-group list-group-flush small">
123
+ {% if _cfg_page %}
117
124
  <a href="{{ '/about/config/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
118
125
  <i class="bi bi-gear me-2 text-body-secondary"></i>Configuration
119
126
  </a>
127
+ {% endif %}
128
+ {% if _theme_page %}
120
129
  <a href="{{ '/about/settings/theme/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
121
130
  <i class="bi bi-palette me-2 text-body-secondary"></i>Theme Customizer
122
131
  </a>
132
+ {% endif %}
133
+ {% if _nav_page %}
123
134
  <a href="{{ '/about/settings/navigation/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
124
135
  <i class="bi bi-signpost-2 me-2 text-body-secondary"></i>Navigation Editor
125
136
  </a>
137
+ {% endif %}
126
138
  </div>
127
139
  </div>
140
+ {% endif %}
128
141
  </div>
129
142
 
130
143
  <!-- Environment Tab -->
131
144
  <div class="tab-pane fade" id="environment-pane" role="tabpanel" aria-labelledby="environment-tab" tabindex="0">
132
145
  {% include components/env-switcher.html %}
133
146
 
134
- <!-- Admin Link -->
147
+ <!-- Admin Link — only when target page exists -->
148
+ {% assign _env_page = site.html_pages | where: "url", "/about/settings/environment/" | first %}
149
+ {% if _env_page %}
135
150
  <div class="mt-4 pt-3 border-top">
136
151
  <a href="{{ '/about/settings/environment/' | relative_url }}" class="btn btn-outline-secondary btn-sm w-100">
137
152
  <i class="bi bi-box-arrow-up-right me-1"></i>Full Environment &amp; Build Info
138
153
  </a>
139
154
  </div>
155
+ {% endif %}
140
156
  </div>
141
157
 
142
158
  <!-- Developer Tab -->
@@ -80,16 +80,33 @@
80
80
  {% if site.email %}<p class="mb-0"><a href="mailto:{{ site.email }}" class="text-light text-decoration-none">{{ site.email }}</a></p>{% endif %}
81
81
  </div>
82
82
 
83
- <!-- Quick Links -->
83
+ <!-- Quick Links
84
+ Resolution order:
85
+ 1. site.footer_quick_links (array of {label, url}) — explicit override
86
+ 2. Auto-detection: only render links whose target pages
87
+ actually exist in the build. Prevents 404s on bare-minimum
88
+ sites that haven't created /about/, /services/, etc. -->
84
89
  <div class="col-12 col-md-6 col-lg-3 mb-3">
85
90
  <h5 class="text-uppercase mb-3">Quick Links</h5>
86
91
  <ul class="list-unstyled" aria-label="Footer quick links">
87
- <li><a href="{{ '/' | relative_url }}" class="text-light text-decoration-none">Home</a></li>
88
- <li><a href="{{ '/about/' | relative_url }}" class="text-light text-decoration-none">About</a></li>
89
- <li><a href="{{ '/services/' | relative_url }}" class="text-light text-decoration-none">Services</a></li>
90
- <li><a href="{{ '/news/' | relative_url }}" class="text-light text-decoration-none">News</a></li>
91
- <li><a href="{{ '/contact/' | relative_url }}" class="text-light text-decoration-none">Contact</a></li>
92
- <li><a href="{{ '/sitemap.xml' | relative_url }}" class="text-light text-decoration-none">Sitemap (XML)</a></li>
92
+ {% if site.footer_quick_links %}
93
+ {% for link in site.footer_quick_links %}
94
+ <li><a href="{{ link.url | relative_url }}" class="text-light text-decoration-none">{{ link.label }}</a></li>
95
+ {% endfor %}
96
+ {% else %}
97
+ <li><a href="{{ '/' | relative_url }}" class="text-light text-decoration-none">Home</a></li>
98
+ {% assign _candidate_links = "About,/about/|Services,/services/|News,/news/|Contact,/contact/" | split: "|" %}
99
+ {% for entry in _candidate_links %}
100
+ {% assign _parts = entry | split: "," %}
101
+ {% assign _label = _parts[0] %}
102
+ {% assign _url = _parts[1] %}
103
+ {% assign _page = site.html_pages | where: "url", _url | first %}
104
+ {% if _page %}
105
+ <li><a href="{{ _url | relative_url }}" class="text-light text-decoration-none">{{ _label }}</a></li>
106
+ {% endif %}
107
+ {% endfor %}
108
+ <li><a href="{{ '/sitemap.xml' | relative_url }}" class="text-light text-decoration-none">Sitemap (XML)</a></li>
109
+ {% endif %}
93
110
  </ul>
94
111
  </div>
95
112
 
@@ -151,8 +168,17 @@
151
168
  </div>
152
169
  <div class="col-md-4 text-md-end">
153
170
  <ul class="list-inline mb-0">
154
- <li class="list-inline-item"><a href="{{ '/privacy-policy' | relative_url }}" class="text-light text-decoration-none">Privacy Policy</a></li>
155
- <li class="list-inline-item"><a href="{{ '/terms-of-service' | relative_url }}" class="text-light text-decoration-none">Terms of Service</a></li>
171
+ {% comment %} Only render policy links whose pages exist (or that are explicitly configured). {% endcomment %}
172
+ {% assign _privacy = site.html_pages | where: "url", "/privacy-policy/" | first %}
173
+ {% unless _privacy %}{% assign _privacy = site.html_pages | where: "url", "/privacy-policy" | first %}{% endunless %}
174
+ {% if _privacy or site.privacy_policy_url %}
175
+ <li class="list-inline-item"><a href="{{ site.privacy_policy_url | default: '/privacy-policy' | relative_url }}" class="text-light text-decoration-none">Privacy Policy</a></li>
176
+ {% endif %}
177
+ {% assign _terms = site.html_pages | where: "url", "/terms-of-service/" | first %}
178
+ {% unless _terms %}{% assign _terms = site.html_pages | where: "url", "/terms-of-service" | first %}{% endunless %}
179
+ {% if _terms or site.terms_of_service_url %}
180
+ <li class="list-inline-item"><a href="{{ site.terms_of_service_url | default: '/terms-of-service' | relative_url }}" class="text-light text-decoration-none">Terms of Service</a></li>
181
+ {% endif %}
156
182
  <li class="list-inline-item">
157
183
  <a href="#" class="text-light text-decoration-none" data-bs-toggle="modal" data-bs-target="#cookieSettingsModal">
158
184
  Cookie Preferences
@@ -272,7 +272,7 @@ is set in `_config.yml`.
272
272
  <code>_about/</code>. Enable them in <code>_config.yml</code>.
273
273
  </p>
274
274
  <a class="btn btn-sm btn-outline-primary"
275
- href="https://github.com/bamr87/zer0-mistakes#content-creation"
275
+ href="https://github.com/bamr87/zer0-mistakes/blob/main/README.md#-quick-start"
276
276
  target="_blank" rel="noopener">
277
277
  Content guide <i class="bi bi-box-arrow-up-right"></i>
278
278
  </a>
@@ -290,7 +290,7 @@ is set in `_config.yml`.
290
290
  your repo to override theme styles without forking.
291
291
  </p>
292
292
  <a class="btn btn-sm btn-outline-success"
293
- href="https://github.com/bamr87/zer0-mistakes#customisation"
293
+ href="https://github.com/bamr87/zer0-mistakes/blob/main/README.md#-key-features"
294
294
  target="_blank" rel="noopener">
295
295
  Customisation <i class="bi bi-box-arrow-up-right"></i>
296
296
  </a>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-zer0
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amr Abdel