jekyll-theme-zer0 0.22.5 → 0.22.19

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +187 -0
  3. data/README.md +66 -19
  4. data/_data/navigation/admin.yml +53 -0
  5. data/_data/theme_backgrounds.yml +121 -0
  6. data/_includes/components/admin-tabs.html +59 -0
  7. data/_includes/components/analytics-dashboard.html +232 -0
  8. data/_includes/components/background-customizer.html +159 -0
  9. data/_includes/components/background-settings.html +137 -0
  10. data/_includes/components/collection-manager.html +151 -0
  11. data/_includes/components/component-showcase.html +452 -0
  12. data/_includes/components/config-editor.html +207 -0
  13. data/_includes/components/config-viewer.html +479 -0
  14. data/_includes/components/env-dashboard.html +154 -0
  15. data/_includes/components/feature-card.html +94 -0
  16. data/_includes/components/info-section.html +172 -149
  17. data/_includes/components/js-cdn.html +4 -1
  18. data/_includes/components/nav-editor.html +99 -0
  19. data/_includes/components/setup-banner.html +28 -0
  20. data/_includes/components/setup-check.html +53 -0
  21. data/_includes/components/svg-background.html +42 -0
  22. data/_includes/components/theme-customizer.html +46 -0
  23. data/_includes/content/seo.html +68 -135
  24. data/_includes/core/footer.html +1 -1
  25. data/_includes/core/head.html +3 -2
  26. data/_includes/core/header.html +14 -7
  27. data/_includes/landing/landing-install-cards.html +18 -7
  28. data/_includes/navigation/admin-nav.html +95 -0
  29. data/_includes/navigation/navbar.html +43 -5
  30. data/_includes/navigation/sidebar-left.html +1 -1
  31. data/_includes/setup/wizard.html +330 -0
  32. data/_layouts/admin.html +166 -0
  33. data/_layouts/landing.html +1 -1
  34. data/_layouts/root.html +12 -6
  35. data/_layouts/setup.html +73 -0
  36. data/_plugins/preview_image_generator.rb +26 -12
  37. data/_sass/core/_navbar.scss +2 -2
  38. data/_sass/custom.scss +6 -6
  39. data/_sass/theme/_background-mixins.scss +95 -0
  40. data/_sass/theme/_backgrounds.scss +156 -0
  41. data/_sass/theme/_color-modes.scss +2 -1
  42. data/assets/backgrounds/gradients/air.svg +15 -0
  43. data/assets/backgrounds/gradients/aqua.svg +15 -0
  44. data/assets/backgrounds/gradients/contrast.svg +15 -0
  45. data/assets/backgrounds/gradients/dark.svg +15 -0
  46. data/assets/backgrounds/gradients/dirt.svg +15 -0
  47. data/assets/backgrounds/gradients/mint.svg +15 -0
  48. data/assets/backgrounds/gradients/neon.svg +15 -0
  49. data/assets/backgrounds/gradients/plum.svg +15 -0
  50. data/assets/backgrounds/gradients/sunrise.svg +15 -0
  51. data/assets/backgrounds/noise/air.svg +8 -0
  52. data/assets/backgrounds/noise/aqua.svg +8 -0
  53. data/assets/backgrounds/noise/contrast.svg +8 -0
  54. data/assets/backgrounds/noise/dark.svg +8 -0
  55. data/assets/backgrounds/noise/dirt.svg +8 -0
  56. data/assets/backgrounds/noise/mint.svg +8 -0
  57. data/assets/backgrounds/noise/neon.svg +8 -0
  58. data/assets/backgrounds/noise/plum.svg +8 -0
  59. data/assets/backgrounds/noise/sunrise.svg +8 -0
  60. data/assets/backgrounds/patterns/air.svg +7 -0
  61. data/assets/backgrounds/patterns/aqua.svg +7 -0
  62. data/assets/backgrounds/patterns/contrast.svg +4 -0
  63. data/assets/backgrounds/patterns/dark.svg +5 -0
  64. data/assets/backgrounds/patterns/dirt.svg +5 -0
  65. data/assets/backgrounds/patterns/mint.svg +6 -0
  66. data/assets/backgrounds/patterns/neon.svg +6 -0
  67. data/assets/backgrounds/patterns/plum.svg +6 -0
  68. data/assets/backgrounds/patterns/sunrise.svg +5 -0
  69. data/assets/js/background-customizer.js +73 -0
  70. data/assets/js/code-copy.js +18 -47
  71. data/assets/js/config-utility.js +307 -0
  72. data/assets/js/nav-editor.js +39 -0
  73. data/assets/js/palette-generator.js +415 -0
  74. data/assets/js/search-modal.js +31 -11
  75. data/assets/js/setup-wizard.js +306 -0
  76. data/assets/js/skin-editor.js +645 -0
  77. data/assets/js/theme-customizer.js +102 -0
  78. data/assets/js/ui-enhancements.js +2 -24
  79. data/assets/vendor/bootstrap/css/bootstrap.min.css +1 -0
  80. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +1 -0
  81. data/scripts/README.md +45 -0
  82. data/scripts/features/generate-preview-images +297 -7
  83. data/scripts/features/install-preview-generator +51 -33
  84. data/scripts/fork-cleanup.sh +92 -19
  85. data/scripts/github-setup.sh +284 -0
  86. data/scripts/init_setup.sh +0 -1
  87. data/scripts/lib/frontmatter.sh +543 -0
  88. data/scripts/lib/migrate.sh +265 -0
  89. data/scripts/lib/preview_generator.py +607 -32
  90. data/scripts/lint-pages +505 -0
  91. data/scripts/migrate.sh +201 -0
  92. data/scripts/platform/setup-linux.sh +244 -0
  93. data/scripts/platform/setup-macos.sh +187 -0
  94. data/scripts/platform/setup-wsl.sh +196 -0
  95. metadata +71 -6
@@ -0,0 +1,151 @@
1
+ <!--
2
+ ===================================================================
3
+ COLLECTION MANAGER — Jekyll collections overview
4
+ ===================================================================
5
+
6
+ File: collection-manager.html
7
+ Path: _includes/components/collection-manager.html
8
+ Purpose: Displays all Jekyll collections with item counts,
9
+ output status, permalink patterns, and default configs.
10
+
11
+ Dependencies: Bootstrap 5 table/card/badge, site.collections
12
+ Used by: pages/_about/settings/collections.md
13
+ ===================================================================
14
+ -->
15
+
16
+ <!-- Summary cards -->
17
+ <div class="row g-3 mb-4">
18
+ <div class="col-6 col-lg-3">
19
+ <div class="card text-center h-100 border-primary">
20
+ <div class="card-body py-3">
21
+ <i class="bi bi-collection fs-3 text-primary"></i>
22
+ <div class="fw-semibold mt-1">{{ site.collections | size }}</div>
23
+ <small class="text-body-secondary">Total Collections</small>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <div class="col-6 col-lg-3">
28
+ <div class="card text-center h-100 border-primary">
29
+ <div class="card-body py-3">
30
+ <i class="bi bi-file-earmark-richtext fs-3 text-primary"></i>
31
+ {% assign total_docs = 0 %}
32
+ {% for c in site.collections %}
33
+ {% assign total_docs = total_docs | plus: c.docs.size %}
34
+ {% endfor %}
35
+ <div class="fw-semibold mt-1">{{ total_docs }}</div>
36
+ <small class="text-body-secondary">Total Documents</small>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <div class="col-6 col-lg-3">
41
+ <div class="card text-center h-100 border-primary">
42
+ <div class="card-body py-3">
43
+ <i class="bi bi-check-circle fs-3 text-primary"></i>
44
+ {% assign output_count = 0 %}
45
+ {% for c in site.collections %}
46
+ {% if c.output %}{% assign output_count = output_count | plus: 1 %}{% endif %}
47
+ {% endfor %}
48
+ <div class="fw-semibold mt-1">{{ output_count }}</div>
49
+ <small class="text-body-secondary">With Output</small>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ <div class="col-6 col-lg-3">
54
+ <div class="card text-center h-100 border-primary">
55
+ <div class="card-body py-3">
56
+ <i class="bi bi-folder2 fs-3 text-primary"></i>
57
+ <div class="fw-semibold mt-1">pages/</div>
58
+ <small class="text-body-secondary">Collections Dir</small>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <!-- Collections table -->
65
+ <div class="table-responsive">
66
+ <table class="table table-hover align-middle">
67
+ <thead class="table-dark">
68
+ <tr>
69
+ <th>Collection</th>
70
+ <th class="text-center">Documents</th>
71
+ <th class="text-center">Output</th>
72
+ <th>Directory</th>
73
+ <th>Permalink</th>
74
+ </tr>
75
+ </thead>
76
+ <tbody>
77
+ {% for collection in site.collections %}
78
+ <tr>
79
+ <td>
80
+ <i class="bi bi-folder-fill text-primary me-1"></i>
81
+ <strong>{{ collection.label }}</strong>
82
+ </td>
83
+ <td class="text-center">
84
+ <span class="badge bg-secondary">{{ collection.docs | size }}</span>
85
+ </td>
86
+ <td class="text-center">
87
+ {% if collection.output %}
88
+ <i class="bi bi-check-circle-fill text-success"></i>
89
+ {% else %}
90
+ <i class="bi bi-x-circle text-body-secondary"></i>
91
+ {% endif %}
92
+ </td>
93
+ <td><code class="small">{{ collection.relative_directory }}</code></td>
94
+ <td>
95
+ {% if collection.permalink %}
96
+ <code class="small">{{ collection.permalink }}</code>
97
+ {% else %}
98
+ <span class="text-body-tertiary small">default</span>
99
+ {% endif %}
100
+ </td>
101
+ </tr>
102
+ {% endfor %}
103
+ </tbody>
104
+ </table>
105
+ </div>
106
+
107
+ <!-- Collection defaults from _config.yml -->
108
+ <h5 class="mt-4 mb-3"><i class="bi bi-sliders me-1"></i> Collection Defaults</h5>
109
+ <div class="accordion" id="collDefaultsAccordion">
110
+ {% for collection in site.collections %}
111
+ {% assign coll_id = collection.label | slugify %}
112
+ <div class="accordion-item">
113
+ <h2 class="accordion-header">
114
+ <button class="accordion-button collapsed" type="button"
115
+ data-bs-toggle="collapse" data-bs-target="#collDef-{{ coll_id }}">
116
+ <i class="bi bi-folder me-2"></i>
117
+ {{ collection.label }}
118
+ <span class="badge bg-secondary ms-2">{{ collection.docs | size }} docs</span>
119
+ </button>
120
+ </h2>
121
+ <div id="collDef-{{ coll_id }}" class="accordion-collapse collapse" data-bs-parent="#collDefaultsAccordion">
122
+ <div class="accordion-body">
123
+ <dl class="row mb-0 small">
124
+ <dt class="col-sm-4">Output</dt>
125
+ <dd class="col-sm-8">{{ collection.output | default: false }}</dd>
126
+ <dt class="col-sm-4">Directory</dt>
127
+ <dd class="col-sm-8"><code>{{ collection.relative_directory }}</code></dd>
128
+ {% if collection.permalink %}
129
+ <dt class="col-sm-4">Permalink</dt>
130
+ <dd class="col-sm-8"><code>{{ collection.permalink }}</code></dd>
131
+ {% endif %}
132
+ </dl>
133
+ {% if collection.docs.size > 0 %}
134
+ <hr>
135
+ <p class="text-body-secondary small mb-1">Recent documents:</p>
136
+ <ul class="list-unstyled mb-0 small">
137
+ {% for doc in collection.docs limit: 5 %}
138
+ <li>
139
+ <a href="{{ doc.url | relative_url }}">{{ doc.title | default: doc.slug }}</a>
140
+ </li>
141
+ {% endfor %}
142
+ {% if collection.docs.size > 5 %}
143
+ <li class="text-body-tertiary">… and {{ collection.docs.size | minus: 5 }} more</li>
144
+ {% endif %}
145
+ </ul>
146
+ {% endif %}
147
+ </div>
148
+ </div>
149
+ </div>
150
+ {% endfor %}
151
+ </div>
@@ -0,0 +1,452 @@
1
+ <!--
2
+ ===================================================================
3
+ COMPONENT SHOWCASE - Live Bootstrap 5 demo gallery
4
+ ===================================================================
5
+
6
+ File: component-showcase.html
7
+ Path: _includes/components/component-showcase.html
8
+ Purpose: Renders live, interactive Bootstrap 5.3 component examples
9
+ that visitors can see and interact with on the page.
10
+ Reusable across news index, docs, and any demo page.
11
+
12
+ Parameters:
13
+ - sections (string) : Comma-separated list of demo sections to show.
14
+ Options: alerts,buttons,badges,cards,accordion,
15
+ tabs,progress,breadcrumbs,table,tooltips,list-group
16
+ Default: all sections
17
+
18
+ Usage:
19
+ {% include components/component-showcase.html %}
20
+ {% include components/component-showcase.html sections="alerts,buttons,cards" %}
21
+
22
+ Dependencies:
23
+ - Bootstrap 5.3 CSS & JS (loaded by theme)
24
+ - Bootstrap Icons (loaded by theme)
25
+ ===================================================================
26
+ -->
27
+ {% assign sections = include.sections | default: "alerts,buttons,badges,cards,accordion,tabs,progress,breadcrumbs,table,tooltips,list-group" %}
28
+ {% assign section_list = sections | split: "," %}
29
+
30
+ {% if section_list contains "alerts" %}
31
+ <!-- ===== ALERTS ===== -->
32
+ <h3 id="showcase-alerts">Alerts</h3>
33
+ <p>Contextual feedback messages for user actions and system status:</p>
34
+ <div class="row g-3 mb-4">
35
+ <div class="col-md-6">
36
+ <div class="alert alert-success d-flex align-items-center" role="alert">
37
+ <i class="bi bi-check-circle-fill me-2 fs-5"></i>
38
+ <div><strong>Build Passed!</strong> Your Jekyll site compiled successfully with zero errors.</div>
39
+ </div>
40
+ </div>
41
+ <div class="col-md-6">
42
+ <div class="alert alert-info d-flex align-items-center" role="alert">
43
+ <i class="bi bi-info-circle-fill me-2 fs-5"></i>
44
+ <div><strong>Tip:</strong> Use <code>docker-compose up</code> for live reload during development.</div>
45
+ </div>
46
+ </div>
47
+ <div class="col-md-6">
48
+ <div class="alert alert-warning d-flex align-items-center" role="alert">
49
+ <i class="bi bi-exclamation-triangle-fill me-2 fs-5"></i>
50
+ <div><strong>Deprecation Notice:</strong> The <code>journals</code> layout will be renamed to <code>article</code> in v1.0.</div>
51
+ </div>
52
+ </div>
53
+ <div class="col-md-6">
54
+ <div class="alert alert-danger d-flex align-items-center" role="alert">
55
+ <i class="bi bi-x-circle-fill me-2 fs-5"></i>
56
+ <div><strong>Error:</strong> Missing <code>_config.yml</code> — run the install script to generate one.</div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ {% endif %}
61
+
62
+ {% if section_list contains "buttons" %}
63
+ <!-- ===== BUTTONS ===== -->
64
+ <h3 id="showcase-buttons">Buttons</h3>
65
+ <p>A complete button system with contextual colors, outlines, and sizes:</p>
66
+ <div class="mb-4">
67
+ <div class="d-flex flex-wrap gap-2 mb-3">
68
+ <button type="button" class="btn btn-primary"><i class="bi bi-rocket-takeoff me-1"></i>Primary</button>
69
+ <button type="button" class="btn btn-secondary"><i class="bi bi-gear me-1"></i>Secondary</button>
70
+ <button type="button" class="btn btn-success"><i class="bi bi-check-lg me-1"></i>Success</button>
71
+ <button type="button" class="btn btn-danger"><i class="bi bi-trash me-1"></i>Danger</button>
72
+ <button type="button" class="btn btn-warning"><i class="bi bi-exclamation-triangle me-1"></i>Warning</button>
73
+ <button type="button" class="btn btn-info"><i class="bi bi-info-circle me-1"></i>Info</button>
74
+ </div>
75
+ <div class="d-flex flex-wrap gap-2 mb-3">
76
+ <button type="button" class="btn btn-outline-primary">Outline Primary</button>
77
+ <button type="button" class="btn btn-outline-secondary">Outline Secondary</button>
78
+ <button type="button" class="btn btn-outline-success">Outline Success</button>
79
+ <button type="button" class="btn btn-outline-danger">Outline Danger</button>
80
+ </div>
81
+ <div class="d-flex flex-wrap gap-2 align-items-center">
82
+ <button type="button" class="btn btn-primary btn-lg">Large</button>
83
+ <button type="button" class="btn btn-primary">Default</button>
84
+ <button type="button" class="btn btn-primary btn-sm">Small</button>
85
+ <div class="btn-group" role="group" aria-label="View toggle">
86
+ <button type="button" class="btn btn-outline-primary"><i class="bi bi-list"></i></button>
87
+ <button type="button" class="btn btn-outline-primary"><i class="bi bi-grid-3x3-gap"></i></button>
88
+ <button type="button" class="btn btn-outline-primary"><i class="bi bi-card-text"></i></button>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ {% endif %}
93
+
94
+ {% if section_list contains "badges" %}
95
+ <!-- ===== BADGES ===== -->
96
+ <h3 id="showcase-badges">Badges</h3>
97
+ <p>Contextual labels, status indicators, and notification counters:</p>
98
+ <div class="mb-4">
99
+ <div class="d-flex flex-wrap gap-2 mb-3">
100
+ <span class="badge bg-primary">Jekyll</span>
101
+ <span class="badge bg-secondary">Bootstrap 5</span>
102
+ <span class="badge bg-success">Deployed</span>
103
+ <span class="badge bg-danger">Breaking</span>
104
+ <span class="badge bg-warning text-dark">Beta</span>
105
+ <span class="badge bg-info">Docker</span>
106
+ <span class="badge bg-dark">v{{ site.version | default: "0.22.6" }}</span>
107
+ </div>
108
+ <div class="d-flex flex-wrap gap-2 mb-3">
109
+ <span class="badge rounded-pill bg-primary">{{ site.posts.size | default: "12" }} Posts</span>
110
+ <span class="badge rounded-pill bg-success">{{ site.data.features.features.size | default: "43" }} Features</span>
111
+ <span class="badge rounded-pill bg-info">{{ site.pages.size | default: "70" }}+ Pages</span>
112
+ </div>
113
+ <div class="d-flex flex-wrap gap-2">
114
+ <button type="button" class="btn btn-primary position-relative">
115
+ Notifications <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">9+</span>
116
+ </button>
117
+ <button type="button" class="btn btn-outline-secondary position-relative">
118
+ Pull Requests <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-success">3</span>
119
+ </button>
120
+ </div>
121
+ </div>
122
+ {% endif %}
123
+
124
+ {% if section_list contains "cards" %}
125
+ <!-- ===== CARDS ===== -->
126
+ <h3 id="showcase-cards">Cards</h3>
127
+ <p>Responsive card layouts — the building block of post listings, feature displays, and documentation:</p>
128
+ <div class="row row-cols-1 row-cols-md-3 g-4 mb-4">
129
+ <div class="col">
130
+ <div class="card h-100 border-0 shadow-sm">
131
+ <div class="card-body text-center p-4">
132
+ <div class="bg-primary text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-3 feature-icon" style="width: 56px; height: 56px;">
133
+ <i class="bi bi-palette fs-4"></i>
134
+ </div>
135
+ <h5 class="card-title">15+ Layouts</h5>
136
+ <p class="card-text text-muted">From landing pages to blog articles, notebooks to statistics dashboards — a layout for every content type.</p>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ <div class="col">
141
+ <div class="card h-100 border-0 shadow-sm">
142
+ <div class="card-body text-center p-4">
143
+ <div class="bg-success text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-3 feature-icon" style="width: 56px; height: 56px;">
144
+ <i class="bi bi-puzzle fs-4"></i>
145
+ </div>
146
+ <h5 class="card-title">54+ Includes</h5>
147
+ <p class="card-text text-muted">Modular, reusable components — navbars, sidebars, analytics, search, cookie consent, and more.</p>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ <div class="col">
152
+ <div class="card h-100 border-0 shadow-sm">
153
+ <div class="card-body text-center p-4">
154
+ <div class="bg-info text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-3 feature-icon" style="width: 56px; height: 56px;">
155
+ <i class="bi bi-braces fs-4"></i>
156
+ </div>
157
+ <h5 class="card-title">19 JS Modules</h5>
158
+ <p class="card-text text-muted">ES6 navigation, code-copy, search modal, color modes, scroll spy, and gesture support.</p>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+ <div class="row row-cols-1 row-cols-md-2 g-4 mb-4">
164
+ <div class="col">
165
+ <div class="card border-start border-primary border-4">
166
+ <div class="card-body">
167
+ <h5 class="card-title"><i class="bi bi-journal-richtext text-primary me-2"></i>Blog Post Card</h5>
168
+ <p class="card-text">Full-featured post cards with preview images, category badges, reading time, author attribution, and tag display.</p>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ <div class="col">
173
+ <div class="card border-start border-success border-4">
174
+ <div class="card-body">
175
+ <h5 class="card-title"><i class="bi bi-book text-success me-2"></i>Documentation Card</h5>
176
+ <p class="card-text">Clean documentation layout with left sidebar navigation, table of contents, breadcrumbs, and responsive typography.</p>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ {% endif %}
182
+
183
+ {% if section_list contains "accordion" %}
184
+ <!-- ===== ACCORDION ===== -->
185
+ <h3 id="showcase-accordion">Accordion</h3>
186
+ <p>Collapsible content sections — ideal for FAQs and detailed documentation:</p>
187
+ <div class="accordion mb-4" id="showcaseAccordion">
188
+ <div class="accordion-item">
189
+ <h2 class="accordion-header">
190
+ <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
191
+ <i class="bi bi-boxes me-2 text-primary"></i> Docker-First Development
192
+ </button>
193
+ </h2>
194
+ <div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#showcaseAccordion">
195
+ <div class="accordion-body">
196
+ The theme includes a complete Docker setup with <code>docker-compose.yml</code> for local development. Run <code>docker-compose up</code> and your site is live at <strong>localhost:4000</strong> with auto-reload. Supports Apple Silicon, Intel, and Linux with zero local Ruby dependencies.
197
+ </div>
198
+ </div>
199
+ </div>
200
+ <div class="accordion-item">
201
+ <h2 class="accordion-header">
202
+ <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
203
+ <i class="bi bi-moon-stars me-2 text-primary"></i> Dark/Light Mode Toggle
204
+ </button>
205
+ </h2>
206
+ <div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#showcaseAccordion">
207
+ <div class="accordion-body">
208
+ Three-way theme switching: <strong>light</strong>, <strong>dark</strong>, or <strong>auto</strong> (follows system preference). User selection persists in localStorage. Powered by Bootstrap's native <code>data-bs-theme</code> attribute with smooth CSS transitions.
209
+ </div>
210
+ </div>
211
+ </div>
212
+ <div class="accordion-item">
213
+ <h2 class="accordion-header">
214
+ <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
215
+ <i class="bi bi-shield-lock me-2 text-primary"></i> Privacy-First Analytics
216
+ </button>
217
+ </h2>
218
+ <div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#showcaseAccordion">
219
+ <div class="accordion-body">
220
+ GDPR/CCPA compliant PostHog integration with a granular cookie consent banner. Analytics only load in production after explicit user consent. Three permission levels: essential, analytics, and marketing — each independently toggleable.
221
+ </div>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ {% endif %}
226
+
227
+ {% if section_list contains "tabs" %}
228
+ <!-- ===== TABS ===== -->
229
+ <h3 id="showcase-tabs">Tabs</h3>
230
+ <p>Tabbed content panels for organizing related information:</p>
231
+ <ul class="nav nav-tabs mb-0" id="showcaseTabs" role="tablist">
232
+ <li class="nav-item" role="presentation">
233
+ <button class="nav-link active" id="remote-tab" data-bs-toggle="tab" data-bs-target="#remote-pane" type="button" role="tab" aria-controls="remote-pane" aria-selected="true">
234
+ <i class="bi bi-cloud me-1"></i>Remote Theme
235
+ </button>
236
+ </li>
237
+ <li class="nav-item" role="presentation">
238
+ <button class="nav-link" id="docker-tab" data-bs-toggle="tab" data-bs-target="#docker-pane" type="button" role="tab" aria-controls="docker-pane" aria-selected="false">
239
+ <i class="bi bi-box-seam me-1"></i>Docker
240
+ </button>
241
+ </li>
242
+ <li class="nav-item" role="presentation">
243
+ <button class="nav-link" id="gem-tab" data-bs-toggle="tab" data-bs-target="#gem-pane" type="button" role="tab" aria-controls="gem-pane" aria-selected="false">
244
+ <i class="bi bi-gem me-1"></i>Ruby Gem
245
+ </button>
246
+ </li>
247
+ </ul>
248
+ <div class="tab-content border border-top-0 rounded-bottom p-3 mb-4">
249
+ <div class="tab-pane fade show active" id="remote-pane" role="tabpanel" aria-labelledby="remote-tab">
250
+ <p class="mb-2">Add to your <code>_config.yml</code> for GitHub Pages:</p>
251
+ <pre class="bg-dark text-light p-3 rounded small"><code>remote_theme: "bamr87/zer0-mistakes"
252
+ plugins:
253
+ - jekyll-remote-theme</code></pre>
254
+ </div>
255
+ <div class="tab-pane fade" id="docker-pane" role="tabpanel" aria-labelledby="docker-tab">
256
+ <p class="mb-2">Run locally with Docker — no Ruby needed:</p>
257
+ <pre class="bg-dark text-light p-3 rounded small"><code>git clone https://github.com/bamr87/zer0-mistakes.git
258
+ cd zer0-mistakes
259
+ docker-compose up
260
+ # Open http://localhost:4000</code></pre>
261
+ </div>
262
+ <div class="tab-pane fade" id="gem-pane" role="tabpanel" aria-labelledby="gem-tab">
263
+ <p class="mb-2">Install as a Ruby gem for classic Jekyll projects:</p>
264
+ <pre class="bg-dark text-light p-3 rounded small"><code># Gemfile
265
+ gem "jekyll-theme-zer0", "~> 0.22"
266
+
267
+ # _config.yml
268
+ theme: jekyll-theme-zer0</code></pre>
269
+ </div>
270
+ </div>
271
+ {% endif %}
272
+
273
+ {% if section_list contains "progress" %}
274
+ <!-- ===== PROGRESS BARS ===== -->
275
+ <h3 id="showcase-progress">Progress Bars</h3>
276
+ <p>Visual indicators for build status, completion tracking, and loading states:</p>
277
+ <div class="mb-4">
278
+ <div class="mb-3">
279
+ <div class="d-flex justify-content-between mb-1">
280
+ <small class="fw-medium">Lighthouse Performance</small>
281
+ <small class="text-muted">95%</small>
282
+ </div>
283
+ <div class="progress" style="height: 8px;">
284
+ <div class="progress-bar bg-success" role="progressbar" style="width: 95%" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100"></div>
285
+ </div>
286
+ </div>
287
+ <div class="mb-3">
288
+ <div class="d-flex justify-content-between mb-1">
289
+ <small class="fw-medium">Accessibility Score</small>
290
+ <small class="text-muted">92%</small>
291
+ </div>
292
+ <div class="progress" style="height: 8px;">
293
+ <div class="progress-bar bg-info" role="progressbar" style="width: 92%" aria-valuenow="92" aria-valuemin="0" aria-valuemax="100"></div>
294
+ </div>
295
+ </div>
296
+ <div class="mb-3">
297
+ <div class="d-flex justify-content-between mb-1">
298
+ <small class="fw-medium">SEO Score</small>
299
+ <small class="text-muted">98%</small>
300
+ </div>
301
+ <div class="progress" style="height: 8px;">
302
+ <div class="progress-bar bg-primary" role="progressbar" style="width: 98%" aria-valuenow="98" aria-valuemin="0" aria-valuemax="100"></div>
303
+ </div>
304
+ </div>
305
+ <div class="mb-3">
306
+ <div class="d-flex justify-content-between mb-1">
307
+ <small class="fw-medium">Best Practices</small>
308
+ <small class="text-muted">100%</small>
309
+ </div>
310
+ <div class="progress" style="height: 8px;">
311
+ <div class="progress-bar bg-success" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
312
+ </div>
313
+ </div>
314
+ </div>
315
+ {% endif %}
316
+
317
+ {% if section_list contains "breadcrumbs" %}
318
+ <!-- ===== BREADCRUMBS ===== -->
319
+ <h3 id="showcase-breadcrumbs">Breadcrumbs</h3>
320
+ <p>Hierarchical navigation trail showing current page position:</p>
321
+ <nav aria-label="breadcrumb example" class="mb-4">
322
+ <ol class="breadcrumb">
323
+ <li class="breadcrumb-item"><a href="/" class="text-decoration-none"><i class="bi bi-house me-1"></i>Home</a></li>
324
+ <li class="breadcrumb-item"><a href="/docs/" class="text-decoration-none">Documentation</a></li>
325
+ <li class="breadcrumb-item"><a href="/docs/customization/" class="text-decoration-none">Customization</a></li>
326
+ <li class="breadcrumb-item active" aria-current="page">Theme Colors</li>
327
+ </ol>
328
+ </nav>
329
+ {% endif %}
330
+
331
+ {% if section_list contains "table" %}
332
+ <!-- ===== TABLE ===== -->
333
+ <h3 id="showcase-table">Responsive Table</h3>
334
+ <p>Styled tables with Bootstrap — all Markdown tables automatically receive Bootstrap styling:</p>
335
+ <div class="table-responsive mb-4">
336
+ <table class="table table-striped table-hover align-middle">
337
+ <thead class="table-dark">
338
+ <tr>
339
+ <th><i class="bi bi-puzzle me-1"></i>Component</th>
340
+ <th><i class="bi bi-folder me-1"></i>Location</th>
341
+ <th><i class="bi bi-tag me-1"></i>Type</th>
342
+ <th class="text-center"><i class="bi bi-check-circle me-1"></i>Status</th>
343
+ </tr>
344
+ </thead>
345
+ <tbody>
346
+ <tr>
347
+ <td><strong>Offcanvas Navbar</strong></td>
348
+ <td><code>_includes/navigation/navbar.html</code></td>
349
+ <td><span class="badge bg-primary">Navigation</span></td>
350
+ <td class="text-center"><span class="badge bg-success rounded-pill">Active</span></td>
351
+ </tr>
352
+ <tr>
353
+ <td><strong>Cookie Consent</strong></td>
354
+ <td><code>_includes/components/cookie-consent.html</code></td>
355
+ <td><span class="badge bg-info">Privacy</span></td>
356
+ <td class="text-center"><span class="badge bg-success rounded-pill">Active</span></td>
357
+ </tr>
358
+ <tr>
359
+ <td><strong>Mermaid Diagrams</strong></td>
360
+ <td><code>_includes/components/mermaid.html</code></td>
361
+ <td><span class="badge bg-warning text-dark">Content</span></td>
362
+ <td class="text-center"><span class="badge bg-success rounded-pill">Active</span></td>
363
+ </tr>
364
+ <tr>
365
+ <td><strong>Search Modal</strong></td>
366
+ <td><code>_includes/components/search-modal.html</code></td>
367
+ <td><span class="badge bg-secondary">UI</span></td>
368
+ <td class="text-center"><span class="badge bg-success rounded-pill">Active</span></td>
369
+ </tr>
370
+ <tr>
371
+ <td><strong>PostHog Analytics</strong></td>
372
+ <td><code>_includes/analytics/posthog.html</code></td>
373
+ <td><span class="badge bg-danger">Analytics</span></td>
374
+ <td class="text-center"><span class="badge bg-success rounded-pill">Active</span></td>
375
+ </tr>
376
+ </tbody>
377
+ </table>
378
+ </div>
379
+ {% endif %}
380
+
381
+ {% if section_list contains "tooltips" %}
382
+ <!-- ===== TOOLTIPS ===== -->
383
+ <h3 id="showcase-tooltips">Tooltips</h3>
384
+ <p>Interactive hints and contextual information on hover:</p>
385
+ <div class="d-flex flex-wrap gap-3 mb-4">
386
+ <button type="button" class="btn btn-outline-primary" data-bs-toggle="tooltip" data-bs-placement="top" title="Press / or Cmd+K to search">
387
+ <i class="bi bi-search me-1"></i>Search Shortcut
388
+ </button>
389
+ <button type="button" class="btn btn-outline-success" data-bs-toggle="tooltip" data-bs-placement="top" title="Toggle between light, dark, and auto modes">
390
+ <i class="bi bi-moon-stars me-1"></i>Theme Toggle
391
+ </button>
392
+ <button type="button" class="btn btn-outline-info" data-bs-toggle="tooltip" data-bs-placement="top" title="Uses Bootstrap Icons 1.10.3">
393
+ <i class="bi bi-emoji-smile me-1"></i>2,000+ Icons
394
+ </button>
395
+ <button type="button" class="btn btn-outline-warning" data-bs-toggle="tooltip" data-bs-placement="top" title="Keyboard [ and ] for section navigation">
396
+ <i class="bi bi-keyboard me-1"></i>Keyboard Nav
397
+ </button>
398
+ </div>
399
+ <script>
400
+ document.addEventListener('DOMContentLoaded', () => {
401
+ if (!window._showcaseTooltipsInit) {
402
+ window._showcaseTooltipsInit = true;
403
+ const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
404
+ tooltipTriggerList.forEach((el) => new bootstrap.Tooltip(el));
405
+ }
406
+ });
407
+ </script>
408
+ {% endif %}
409
+
410
+ {% if section_list contains "list-group" %}
411
+ <!-- ===== LIST GROUP ===== -->
412
+ <h3 id="showcase-list-group">List Group</h3>
413
+ <p>Organized content lists with icons, badges, and action states:</p>
414
+ <div class="row g-4 mb-4">
415
+ <div class="col-md-6">
416
+ <div class="list-group">
417
+ <a href="/pages/" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
418
+ <span><i class="bi bi-journal-richtext text-primary me-2"></i>Blog Posts</span>
419
+ <span class="badge bg-primary rounded-pill">{{ site.posts.size | default: "12" }}</span>
420
+ </a>
421
+ <a href="/docs/" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
422
+ <span><i class="bi bi-book text-success me-2"></i>Documentation</span>
423
+ <span class="badge bg-success rounded-pill">{{ site.documents.size | default: "8" }}</span>
424
+ </a>
425
+ <a href="/categories/" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
426
+ <span><i class="bi bi-collection text-info me-2"></i>Categories</span>
427
+ <span class="badge bg-info rounded-pill">{{ site.categories.size | default: "6" }}</span>
428
+ </a>
429
+ <a href="/tags/" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
430
+ <span><i class="bi bi-tags text-warning me-2"></i>Tags</span>
431
+ <span class="badge bg-warning text-dark rounded-pill">{{ site.tags.size | default: "24" }}</span>
432
+ </a>
433
+ </div>
434
+ </div>
435
+ <div class="col-md-6">
436
+ <div class="list-group">
437
+ <div class="list-group-item list-group-item-success d-flex align-items-center">
438
+ <i class="bi bi-check-circle-fill me-2"></i> Bootstrap 5.3.3 integrated
439
+ </div>
440
+ <div class="list-group-item list-group-item-success d-flex align-items-center">
441
+ <i class="bi bi-check-circle-fill me-2"></i> Docker development ready
442
+ </div>
443
+ <div class="list-group-item list-group-item-success d-flex align-items-center">
444
+ <i class="bi bi-check-circle-fill me-2"></i> GitHub Pages compatible
445
+ </div>
446
+ <div class="list-group-item list-group-item-success d-flex align-items-center">
447
+ <i class="bi bi-check-circle-fill me-2"></i> Privacy-first analytics
448
+ </div>
449
+ </div>
450
+ </div>
451
+ </div>
452
+ {% endif %}