jekyll-theme-zer0 0.22.19 → 0.22.21

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: ba91ba02a96ff1b026fe82adedbebd79b476a48bc3534ff7b1799ebbf9e593d7
4
- data.tar.gz: 4d1470d33ae3e6d41def0fbd22e05c07bf9597efa9f5c5e655f3dd61088896a4
3
+ metadata.gz: 2aacda403198b850de5d92f7772711bb966a67f97cb631e5004c858c5b0e7abe
4
+ data.tar.gz: 1a650590947487377be84dc2c02fb56d18f443f4e60c470869393ffe013c10cf
5
5
  SHA512:
6
- metadata.gz: f643278addd297e92c075dc79f9802daf61bc9ca2bb4c5cde4dec6842da25895e0c9ea75f597cdc718fbc5dcc4b078f752f3e32ae310b3ca884d9fd82fc1c1d9
7
- data.tar.gz: e2318d7d03c184b9a053d59c2130b818486d1cb20ce6938ec38e88e0b2459bee62108abfa223941857e4707f32313b5fefa5bef01682c4800f3a9c25f112159f
6
+ metadata.gz: c33bdf8c1943e8a52b35fc70290b4f895449b3fed491ff3869ffdd0b86d4989e89924eeb4bd0b590259badce91f2c89c32f3e353580b19de4660346bb095a544
7
+ data.tar.gz: 90bcf614157a4208fb86152fd3f403065a3f6bb906bf51151bbef8536ebb4e3d1093427768cf62c0027bf332bbc35333248f0fa5851b743bed51b5ada80b34cf
data/CHANGELOG.md CHANGED
@@ -1,21 +1,27 @@
1
1
  # Changelog
2
2
 
3
- ## [0.22.19] - 2026-04-18
3
+ ## [0.22.21] - 2026-04-19
4
4
 
5
5
  ### Changed
6
6
  - Version bump: patch release
7
7
 
8
8
  ### Commits in this release
9
- - 1b3993e docs(fork): add fork-to-deploy workflow and user site guidance (#56)
9
+ - 7f00e4d docs(roadmap): data-driven roadmap with auto-generated README mermaid diagram (#71)
10
10
 
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
14
  ### Added
15
+ - **Roadmap data file**: `_data/roadmap.yml` is now the single source of truth for the project roadmap (versions, status, dates, targets, and feature highlights).
16
+ - **Roadmap generator**: `scripts/generate-roadmap.rb` (and shell wrapper `scripts/generate-roadmap.sh`) renders a Mermaid gantt diagram and summary table from `_data/roadmap.yml` and injects them into `README.md` between `<!-- ROADMAP_MERMAID:START/END -->` and `<!-- ROADMAP_TABLE:START/END -->` markers. Supports `--check` mode for CI drift detection and `--stdout` for previewing.
17
+ - **Roadmap sync workflow**: `.github/workflows/roadmap-sync.yml` regenerates the README on push to `main` when the data file or generator changes, and verifies sync on PRs that touch those files.
15
18
  - **Docs**: `docs/FORKING.md` — progressive fork → configure → personalize workflow for the `username.github.io` user-site pattern
16
19
  - **Tests**: `test/test_fork_cleanup.sh` — 32-assertion suite covering CLI parsing, dry-run, real cleanup, YAML anchor preservation, and idempotency
17
20
 
18
21
  ### Changed
22
+ - **README roadmap section** is now auto-generated from `_data/roadmap.yml` instead of being hand-maintained, and includes status, target, and detailed highlight columns.
23
+ - **`pages/roadmap.md`** rewritten to render the Mermaid gantt chart, release summary, and per-version detail sections directly from `_data/roadmap.yml` via Liquid — so the Jekyll page is always live with the canonical data.
24
+ - **`_data/README.md`** documents the new `roadmap.yml` data file.
19
25
  - **Landing page**: `_includes/landing/landing-install-cards.html` — “Fork & Deploy” card now guides users to fork into `<username>.github.io` and run `scripts/fork-cleanup.sh`; safer `github_fork` URL handling
20
26
  - **README**: `README.md` — Method 3 (Fork & Customize) reframed as “Fork & Deploy as Your Site” with a 4-step path; deployment section updated for user-site flow
21
27
  - **Docs**: `pages/_quickstart/github-setup.md`, `pages/_quickstart/index.md`, `pages/_docs/getting-started/quick-start.md`, `pages/_docs/deployment/github-pages.md`, `docs/configuration/url-configuration-guide.md` — aligned with the user-site fork pattern (`baseurl: ""`)
@@ -28,6 +34,24 @@
28
34
  - **Fork cleanup**: `scripts/fork-cleanup.sh` — `posthog`/`giscus` blocks reset only within their own YAML range (no stray matches in unrelated blocks)
29
35
  - **Welcome post**: `templates/pages/welcome-post.md.template` and embedded fallback in `scripts/fork-cleanup.sh` — corrected `layout: journals` → `layout: article` so the generated welcome post builds without “Layout does not exist” warnings on a freshly cleaned fork
30
36
 
37
+ ## [0.22.20] - 2026-04-19
38
+
39
+ ### Changed
40
+ - Version bump: patch release
41
+
42
+ ### Commits in this release
43
+ - f5d5e97 fix(ui): UI/UX fixes — navbar dropdown, landing hero, cookie banner, nanobar, footer (#72)
44
+
45
+
46
+ ## [0.22.19] - 2026-04-18
47
+
48
+ ### Changed
49
+ - Version bump: patch release
50
+
51
+ ### Commits in this release
52
+ - 1b3993e docs(fork): add fork-to-deploy workflow and user site guidance (#56)
53
+
54
+
31
55
  ## [0.22.18] - 2026-04-18
32
56
 
33
57
  ### Changed
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  title: zer0-mistakes
3
3
  sub-title: Jekyll Theme
4
4
  description: GitHub Pages compatible Jekyll theme with Bootstrap 5.3, featuring automated installation and comprehensive documentation.
5
- version: 0.22.19
5
+ version: 0.22.21
6
6
  layout: landing
7
7
  tags:
8
8
  - jekyll
@@ -14,7 +14,7 @@ categories:
14
14
  - docker
15
15
  - bootstrap
16
16
  created: 2024-02-10T23:51:11.480Z
17
- lastmod: 2026-04-18T21:22:34.000Z
17
+ lastmod: 2026-04-19T17:07:38.000Z
18
18
  draft: false
19
19
  permalink: /
20
20
  slug: zer0
@@ -708,33 +708,47 @@ bash scripts/release major # 0.21.5 → 1.0.0
708
708
 
709
709
  ## 🗺 Roadmap
710
710
 
711
- See the full [Roadmap page](/roadmap/) for detailed plans and timeline.
711
+ The diagram and table below are auto-generated from [`_data/roadmap.yml`](_data/roadmap.yml) by [`scripts/generate-roadmap.sh`](scripts/generate-roadmap.sh). See the full [Roadmap page](/roadmap/) for per-version detail and the [PRD](docs/PRD.md) for product context.
712
+
713
+ <!-- ROADMAP_MERMAID:START -->
712
714
 
713
715
  ```mermaid
714
716
  gantt
715
717
  title zer0-mistakes Roadmap
716
718
  dateFormat YYYY-MM
717
719
  section Completed
718
- v0.17 ES6 Navigation :done, 2025-12, 2025-12
719
- v0.18 Site Search :done, 2026-01, 2026-01
720
- v0.19 Feature Discovery :done, 2026-01, 2026-01
721
- v0.20 Navigation Redesign :done, 2026-02, 2026-02
722
- v0.21 Env Switcher :done, 2026-02, 2026-03
720
+ v0.17 ES6 Navigation :done, 2025-12, 2025-12
721
+ v0.18 Site Search :done, 2026-01, 2026-01
722
+ v0.19 Feature Discovery :done, 2026-01, 2026-01
723
+ v0.20 Navigation Redesign :done, 2026-02, 2026-02
724
+ v0.21 Env Switcher :done, 2026-02, 2026-03
723
725
  section Current
724
- v0.22 AIEO Optimization :active, 2026-03, 2026-04
726
+ v0.22 AIEO & Customization :active, 2026-03, 2026-04
725
727
  section Future
726
- v0.23 CMS Integration :2026-05, 2026-07
727
- v0.24 i18n Support :2026-07, 2026-09
728
- v1.0 Stable Release :milestone, 2027-01, 1d
728
+ v0.23 CMS Integration :2026-05, 2026-07
729
+ v0.24 i18n Support :2026-07, 2026-09
730
+ v0.25 Advanced Analytics :2026-09, 2026-11
731
+ v1.0 Stable Release :milestone, 2027-01, 1d
729
732
  ```
730
733
 
731
- | Version | Target | Features |
732
- |---------|--------|----------|
733
- | **v0.21** | Completed | Environment switcher, navigation redesign, settings modal |
734
- | **v0.22** | Q1 2026 | AIEO optimization, structured data, FAQ, glossary |
735
- | **v0.23** | Q2 2026 | Headless CMS integration, content API |
736
- | **v0.24** | Q3 2026 | Multi-language support (i18n) |
737
- | **v1.0** | Q1 2027 | Stable API, 90%+ test coverage |
734
+ <!-- ROADMAP_MERMAID:END -->
735
+
736
+ <!-- ROADMAP_TABLE:START -->
737
+
738
+ | Version | Status | Target | Highlights |
739
+ |---------|--------|--------|------------|
740
+ | **v0.17** | Completed | Dec 2025 | ES6 modular navigation with auto-hide navbar, hover dropdowns, keyboard navigation, and touch gestures. |
741
+ | **v0.18** | ✅ Completed | Jan 2026 | Client-side site search with a keyboard-shortcut search modal. |
742
+ | **v0.19** | ✅ Completed | Jan 2026 | 43 documented features with a comprehensive feature registry. |
743
+ | **v0.20** | ✅ Completed | Feb 2026 | Local Docker publishing pipeline and CI variable abstraction. |
744
+ | **v0.21** | ✅ Completed | Feb 2026 | Environment switcher, settings modal redesign, and RubyGems API-key auth. |
745
+ | **v0.22** | 🚧 In Progress | Q1–Q2 2026 | AI Engine Optimization (AIEO), structured data, and visual customization tools. |
746
+ | **v0.23** | 🗓 Planned | Q2 2026 | Headless CMS integration with a content API and admin dashboard. |
747
+ | **v0.24** | 🗓 Planned | Q3 2026 | Multi-language content support with locale-aware routing. |
748
+ | **v0.25** | 🗓 Planned | Q4 2026 | Visual theme customizer, A/B testing, and conversion funnels. |
749
+ | **v1.0** | 🎯 Milestone | Q1 2027 | Stable public API, 90%+ test coverage, and long-term support commitment. |
750
+
751
+ <!-- ROADMAP_TABLE:END -->
738
752
 
739
753
  ---
740
754
 
@@ -789,7 +803,7 @@ git push origin feature/awesome-feature
789
803
 
790
804
  | Metric | Value |
791
805
  |--------|-------|
792
- | **Current Version** | 0.22.19 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
806
+ | **Current Version** | 0.22.21 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
793
807
  | **Documented Features** | 43 ([Feature Registry](https://github.com/bamr87/zer0-mistakes/blob/main/_data/features.yml)) |
794
808
  | **Setup Time** | 2-5 minutes ([install.sh benchmarks](https://github.com/bamr87/zer0-mistakes/blob/main/install.sh)) |
795
809
  | **Documentation Pages** | 70+ ([browse docs](/pages/)) |
@@ -832,6 +846,6 @@ Built with these amazing technologies:
832
846
 
833
847
  **Built with ❤️ for the Jekyll community**
834
848
 
835
- **v0.22.19** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md)
849
+ **v0.22.21** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md)
836
850
 
837
851
 
data/_data/README.md CHANGED
@@ -9,6 +9,7 @@ This directory contains YAML data files that power the Zer0-Mistakes Jekyll them
9
9
  | `navigation/` | Site navigation menus | No |
10
10
  | `authors.yml` | Author profile information | No |
11
11
  | `content_statistics.yml` | Site content analytics | **Yes** |
12
+ | `roadmap.yml` | Single source of truth for the project roadmap (drives the README mermaid diagram and the `/roadmap/` Jekyll page) | No |
12
13
  | `statistics_config.yml` | Statistics generation config | No |
13
14
  | `ui-text.yml` | Multilingual UI text labels | No |
14
15
  | `prerequisites.yml` | Educational prerequisites | No |
data/_data/roadmap.yml ADDED
@@ -0,0 +1,215 @@
1
+ # =============================================================================
2
+ # zer0-mistakes Roadmap — Single Source of Truth
3
+ # =============================================================================
4
+ #
5
+ # This file is the canonical source for the project roadmap. It powers:
6
+ #
7
+ # 1. The Mermaid gantt diagram and summary table in README.md
8
+ # (auto-generated by `scripts/generate-roadmap.sh` between
9
+ # <!-- ROADMAP_MERMAID:START --> / <!-- ROADMAP_MERMAID:END -->
10
+ # and <!-- ROADMAP_TABLE:START --> / <!-- ROADMAP_TABLE:END --> markers).
11
+ #
12
+ # 2. The /roadmap/ Jekyll page (`pages/roadmap.md`), which renders the
13
+ # diagram, release history, and per-version sections directly from
14
+ # this file via Liquid (always live on the site).
15
+ #
16
+ # To update the roadmap:
17
+ # 1. Edit this file.
18
+ # 2. Run `./scripts/generate-roadmap.sh` to refresh the README.
19
+ # 3. Commit both this file and the resulting README.md changes.
20
+ #
21
+ # A GitHub Actions workflow (`.github/workflows/roadmap-sync.yml`) also runs
22
+ # the generator automatically on push when this file changes.
23
+ #
24
+ # =============================================================================
25
+ # Schema
26
+ # =============================================================================
27
+ #
28
+ # meta:
29
+ # title: Title displayed in the Mermaid gantt chart
30
+ # tagline: Short tagline shown on the roadmap page
31
+ # updated: Last-reviewed date (YYYY-MM-DD)
32
+ #
33
+ # milestones:
34
+ # - version: Semantic version string (e.g. "0.22")
35
+ # title: Theme/feature name (short)
36
+ # status: completed | active | planned | milestone
37
+ # section: Group label in the gantt (Completed / Current / Future)
38
+ # start: Start month (YYYY-MM) — required
39
+ # end: End month (YYYY-MM) — required for ranges
40
+ # target: Human-readable target (e.g. "Q2 2026")
41
+ # released: Actual release date for shipped versions (YYYY-MM-DD)
42
+ # summary: One-line description
43
+ # features: List of bullet points (used on the roadmap page)
44
+ #
45
+ # =============================================================================
46
+
47
+ meta:
48
+ title: "zer0-mistakes Roadmap"
49
+ tagline: "Past releases, current focus, and future plans for the zer0-mistakes Jekyll theme."
50
+ updated: 2026-04-18
51
+
52
+ milestones:
53
+ # --- Completed -------------------------------------------------------------
54
+
55
+ - version: "0.17"
56
+ title: "ES6 Navigation"
57
+ status: completed
58
+ section: Completed
59
+ start: 2025-12
60
+ end: 2025-12
61
+ released: 2025-12-15
62
+ summary: "ES6 modular navigation with auto-hide navbar, hover dropdowns, keyboard navigation, and touch gestures."
63
+ features:
64
+ - "ES6 navigation modules"
65
+ - "Auto-hide navbar on scroll"
66
+ - "Hover dropdowns with keyboard navigation"
67
+ - "Touch gestures for mobile"
68
+
69
+ - version: "0.18"
70
+ title: "Site Search"
71
+ status: completed
72
+ section: Completed
73
+ start: 2026-01
74
+ end: 2026-01
75
+ released: 2026-01-15
76
+ summary: "Client-side site search with a keyboard-shortcut search modal."
77
+ features:
78
+ - "Client-side search index"
79
+ - "Search modal with keyboard shortcuts"
80
+ - "GitHub Pages compatible (no server required)"
81
+
82
+ - version: "0.19"
83
+ title: "Feature Discovery"
84
+ status: completed
85
+ section: Completed
86
+ start: 2026-01
87
+ end: 2026-01
88
+ released: 2026-01-25
89
+ summary: "43 documented features with a comprehensive feature registry."
90
+ features:
91
+ - "Feature registry in `_data/features.yml`"
92
+ - "User-facing feature pages"
93
+ - "Cross-linked from documentation"
94
+
95
+ - version: "0.20"
96
+ title: "Navigation Redesign"
97
+ status: completed
98
+ section: Completed
99
+ start: 2026-02
100
+ end: 2026-02
101
+ released: 2026-02-01
102
+ summary: "Local Docker publishing pipeline and CI variable abstraction."
103
+ features:
104
+ - "Local Docker publishing pipeline"
105
+ - "CI variable abstraction"
106
+ - "Navigation refactor"
107
+
108
+ - version: "0.21"
109
+ title: "Env Switcher"
110
+ status: completed
111
+ section: Completed
112
+ start: 2026-02
113
+ end: 2026-03
114
+ released: 2026-02-01
115
+ summary: "Environment switcher, settings modal redesign, and RubyGems API-key auth."
116
+ features:
117
+ - "Environment switcher"
118
+ - "Settings modal with tabs"
119
+ - "RubyGems API-key authentication"
120
+ - "Dependency updates"
121
+
122
+ # --- Current ---------------------------------------------------------------
123
+
124
+ - version: "0.22"
125
+ title: "AIEO & Customization"
126
+ status: active
127
+ section: Current
128
+ start: 2026-03
129
+ end: 2026-04
130
+ target: "Q1–Q2 2026"
131
+ summary: "AI Engine Optimization (AIEO), structured data, and visual customization tools."
132
+ features:
133
+ - "JSON-LD `SoftwareApplication`, `WebPage`, `Person`, and `FAQPage` schemas"
134
+ - "Author E-E-A-T visibility block on the landing page"
135
+ - "FAQ page with FAQPage schema"
136
+ - "Glossary with key term definitions"
137
+ - "Roadmap page with temporal anchoring"
138
+ - "Citation hooks on project stats"
139
+ - "Skin editor with live color pickers and palette generator"
140
+ - "Admin layout and configuration dashboards"
141
+ - "Playwright visual regression tests"
142
+ - "Vendored assets (Bootstrap, Icons, Mermaid — no runtime CDN)"
143
+ - "Copilot Agent prompt button with data-driven prompt registry"
144
+ - "Universal installer (remote / github / codespaces modes)"
145
+ - "Dynamic collection-based navigation fallback for zero-config sites"
146
+
147
+ # --- Future ----------------------------------------------------------------
148
+
149
+ - version: "0.23"
150
+ title: "CMS Integration"
151
+ status: planned
152
+ section: Future
153
+ start: 2026-05
154
+ end: 2026-07
155
+ target: "Q2 2026"
156
+ summary: "Headless CMS integration with a content API and admin dashboard."
157
+ features:
158
+ - "Headless CMS integration (Decap CMS or Tina)"
159
+ - "Content API for programmatic access"
160
+ - "Admin dashboard for content management"
161
+ - "Draft preview workflow"
162
+ - "Multi-author collaboration"
163
+
164
+ - version: "0.24"
165
+ title: "i18n Support"
166
+ status: planned
167
+ section: Future
168
+ start: 2026-07
169
+ end: 2026-09
170
+ target: "Q3 2026"
171
+ summary: "Multi-language content support with locale-aware routing."
172
+ features:
173
+ - "Multi-language content support"
174
+ - "Locale-aware routing"
175
+ - "Translated UI strings via `_data/ui-text.yml`"
176
+ - "Right-to-left (RTL) layout support"
177
+
178
+ - version: "0.25"
179
+ title: "Advanced Analytics"
180
+ status: planned
181
+ section: Future
182
+ start: 2026-09
183
+ end: 2026-11
184
+ target: "Q4 2026"
185
+ summary: "Visual theme customizer, A/B testing, and conversion funnels."
186
+ features:
187
+ - "A/B testing framework"
188
+ - "Conversion funnels"
189
+ - "Heatmap visualization"
190
+ - "Visual theme customizer enhancements"
191
+
192
+ - version: "1.0"
193
+ title: "Stable Release"
194
+ status: milestone
195
+ section: Future
196
+ start: 2027-01
197
+ end: 2027-01
198
+ target: "Q1 2027"
199
+ summary: "Stable public API, 90%+ test coverage, and long-term support commitment."
200
+ features:
201
+ - "Stable public API for theme customization"
202
+ - "90%+ automated test coverage"
203
+ - "Migration guide from Minima and other themes"
204
+ - "Performance benchmarks met"
205
+ - "Security audit passed"
206
+ - "Long-term support (LTS) commitment"
207
+
208
+ # =============================================================================
209
+ # Prioritization signals
210
+ # =============================================================================
211
+ prioritization:
212
+ - "Community feedback — GitHub Issues and Discussions"
213
+ - "Usage analytics — privacy-compliant PostHog data on feature adoption"
214
+ - "Ecosystem changes — Jekyll, Bootstrap, and GitHub Pages updates"
215
+ - "Contributor interest — open feature requests that attract PRs"
@@ -49,7 +49,7 @@ Usage: Include in root.html layout
49
49
  Configuration: Uses site.posthog settings from _config.yml
50
50
  {% endcomment %}
51
51
 
52
- <div id="cookieConsent" class="cookie-consent-banner position-fixed bottom-0 start-0 end-0 bg-dark text-light py-3 px-3 shadow-lg">
52
+ <div id="cookieConsent" class="cookie-consent-banner position-fixed bottom-0 start-0 end-0 bg-dark text-light py-3 px-3 shadow-lg" hidden>
53
53
  <div class="container-xl px-3 px-md-4">
54
54
  <div class="row align-items-center g-2">
55
55
  <div class="col-12 col-lg-8">
@@ -249,42 +249,41 @@ Configuration: Uses site.posthog settings from _config.yml
249
249
  function showConsentBanner() {
250
250
  const banner = document.getElementById('cookieConsent');
251
251
  if (!banner) return;
252
-
253
- // Ensure banner starts completely hidden - remove all classes and inline styles
254
- banner.classList.remove('cookie-banner-showing', 'cookie-banner-visible');
255
- banner.removeAttribute('style'); // Remove all inline styles to let CSS take over
256
-
257
- // Wait for the delay, then show and animate in one smooth motion
252
+
253
+ // Reveal the element (CSS keeps it translated off-screen + opacity:0).
254
+ banner.hidden = false;
255
+ banner.classList.remove('cookie-banner-visible');
256
+
258
257
  setTimeout(() => {
259
- // First, make it visible but still off-screen (using class for CSS control)
260
- banner.classList.add('cookie-banner-showing');
261
-
262
- // Force a reflow to ensure the display change is applied
258
+ // Force reflow so the next class change actually animates.
263
259
  void banner.offsetHeight;
264
-
265
- // On the next frame, animate it in smoothly
266
- requestAnimationFrame(() => {
267
- requestAnimationFrame(() => {
268
- banner.classList.add('cookie-banner-visible');
269
- });
270
- });
271
- }, 1000); // Show after 1 second
260
+ banner.classList.add('cookie-banner-visible');
261
+ }, 1000);
272
262
  }
273
263
 
274
264
  // Hide consent banner
275
265
  function hideConsentBanner() {
276
266
  const banner = document.getElementById('cookieConsent');
277
- if (banner) {
278
- // Remove visible class to trigger transition out
279
- banner.classList.remove('cookie-banner-visible');
280
-
281
- // Hide after transition completes
282
- banner.addEventListener('transitionend', function hideAfterTransition() {
283
- banner.classList.remove('cookie-banner-showing');
284
- banner.removeAttribute('style'); // Clean up inline styles
285
- banner.removeEventListener('transitionend', hideAfterTransition);
286
- }, { once: true });
287
- }
267
+ if (!banner) return;
268
+
269
+ banner.classList.remove('cookie-banner-visible');
270
+
271
+ let done = false;
272
+ const finish = () => {
273
+ if (done) return;
274
+ done = true;
275
+ banner.hidden = true;
276
+ banner.removeEventListener('transitionend', onEnd);
277
+ };
278
+ const onEnd = (e) => {
279
+ if (e.target !== banner) return;
280
+ if (e.propertyName !== 'transform' && e.propertyName !== 'opacity') return;
281
+ finish();
282
+ };
283
+ banner.addEventListener('transitionend', onEnd);
284
+ // Fallback in case transitionend never fires (reduced-motion, interrupted transition,
285
+ // background tab, etc.). Slightly longer than the longest CSS transition (0.4s).
286
+ setTimeout(finish, 500);
288
287
  }
289
288
 
290
289
  // Update modal UI with current preferences
@@ -306,26 +305,13 @@ Configuration: Uses site.posthog settings from _config.yml
306
305
  // Initialize on DOM content loaded
307
306
  document.addEventListener('DOMContentLoaded', function() {
308
307
  const banner = document.getElementById('cookieConsent');
309
-
310
- // Ensure banner starts completely hidden BEFORE any checks
311
- // Remove all classes and inline styles - let CSS handle hiding
312
- if (banner) {
313
- banner.classList.remove('cookie-banner-showing', 'cookie-banner-visible');
314
- banner.removeAttribute('style');
315
- }
316
-
317
308
  const existingConsent = getConsentState();
318
-
309
+
319
310
  if (existingConsent) {
320
- // Apply existing consent and ensure banner stays hidden
321
311
  applyConsent(existingConsent);
322
312
  updateModalUI(existingConsent);
323
- if (banner) {
324
- banner.classList.remove('cookie-banner-showing', 'cookie-banner-visible');
325
- banner.removeAttribute('style');
326
- }
327
- } else {
328
- // Show consent banner for new visitors (with delay)
313
+ // Banner already starts hidden via the `hidden` attribute — nothing to do.
314
+ } else if (banner) {
329
315
  showConsentBanner();
330
316
  }
331
317
 
@@ -385,70 +371,19 @@ Configuration: Uses site.posthog settings from _config.yml
385
371
  </script>
386
372
 
387
373
  <style>
388
- /* Banner base styles */
389
- #cookieConsent {
390
- z-index: 9999;
391
- transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1);
392
- }
393
-
394
- /* Banner starts completely hidden - CSS enforces this */
395
- #cookieConsent:not(.cookie-banner-showing) {
396
- display: none !important;
397
- visibility: hidden !important;
398
- opacity: 0 !important;
399
- transform: translateY(100%) !important;
400
- }
401
-
402
- .cookie-consent-banner {
403
- background: linear-gradient(135deg, #2c3e50 0%, #3498db 100%);
404
- backdrop-filter: blur(10px);
405
- border-top: 1px solid rgba(255, 255, 255, 0.1);
406
- }
407
-
408
- /* Only show banner when explicitly enabled via JavaScript class */
409
- #cookieConsent.cookie-banner-showing {
410
- display: block !important;
411
- visibility: visible !important;
412
- opacity: 0;
413
- transform: translateY(100%);
414
- }
415
-
416
- /* Animate in when visible class is added */
417
- #cookieConsent.cookie-banner-showing.cookie-banner-visible {
418
- opacity: 1 !important;
419
- transform: translateY(0) !important;
420
- }
421
-
374
+ /* Modal-only helpers; banner styling lives in _sass/custom.scss */
422
375
  .cursor-pointer {
423
376
  cursor: pointer;
424
377
  }
425
-
378
+
426
379
  .cookie-category {
427
380
  border: 1px solid #dee2e6;
428
381
  border-radius: 8px;
429
382
  padding: 1rem;
430
383
  }
431
-
384
+
432
385
  .form-check-input:checked {
433
386
  background-color: var(--bs-success);
434
387
  border-color: var(--bs-success);
435
388
  }
436
-
437
- @media (max-width: 768px) {
438
- .cookie-consent-banner .btn {
439
- width: 100%;
440
- margin-bottom: 0.5rem;
441
- }
442
-
443
- .cookie-consent-banner .btn:last-child {
444
- margin-bottom: 0;
445
- }
446
- }
447
-
448
- /* Respect reduced motion preferences */
449
- @media (prefers-reduced-motion: reduce) {
450
- .cookie-consent-banner {
451
- transition: none !important;
452
- }
453
- }
454
389
  </style>