jekyll-theme-zer0 0.22.0 → 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 +236 -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 +23 -9
  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 +28 -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 +15 -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,330 @@
1
+ <!--
2
+ ===================================================================
3
+ SETUP WIZARD — Interactive _config.yml Generator
4
+ ===================================================================
5
+
6
+ File: wizard.html
7
+ Path: _includes/setup/wizard.html
8
+ Purpose: Multi-step Bootstrap form that builds a complete _config.yml
9
+ and lets the user download or copy it.
10
+
11
+ Dependencies: Bootstrap 5.3, assets/js/setup-wizard.js
12
+ Environment: Development only (guarded by calling page)
13
+ ===================================================================
14
+ -->
15
+
16
+ <div class="container py-4" id="setup-wizard">
17
+ <div class="row justify-content-center">
18
+ <div class="col-lg-10">
19
+
20
+ <h1 class="mb-2"><i class="bi bi-gear-wide-connected"></i> Site Setup Wizard</h1>
21
+ <p class="lead text-muted mb-4">
22
+ Fill in the form to generate a personalised <code>_config.yml</code>.
23
+ Download it and replace the one in your project root.
24
+ </p>
25
+
26
+ <!-- ============================================================ -->
27
+ <!-- Progress Tabs -->
28
+ <!-- ============================================================ -->
29
+ <ul class="nav nav-pills nav-fill mb-4" id="wizardTabs" role="tablist">
30
+ <li class="nav-item" role="presentation">
31
+ <button class="nav-link active" id="tab-identity"
32
+ data-bs-toggle="pill" data-bs-target="#step-identity"
33
+ type="button" role="tab">
34
+ <i class="bi bi-person-badge"></i> Identity
35
+ </button>
36
+ </li>
37
+ <li class="nav-item" role="presentation">
38
+ <button class="nav-link" id="tab-urls"
39
+ data-bs-toggle="pill" data-bs-target="#step-urls"
40
+ type="button" role="tab">
41
+ <i class="bi bi-link-45deg"></i> URLs
42
+ </button>
43
+ </li>
44
+ <li class="nav-item" role="presentation">
45
+ <button class="nav-link" id="tab-collections"
46
+ data-bs-toggle="pill" data-bs-target="#step-collections"
47
+ type="button" role="tab">
48
+ <i class="bi bi-collection"></i> Collections
49
+ </button>
50
+ </li>
51
+ <li class="nav-item" role="presentation">
52
+ <button class="nav-link" id="tab-analytics"
53
+ data-bs-toggle="pill" data-bs-target="#step-analytics"
54
+ type="button" role="tab">
55
+ <i class="bi bi-graph-up"></i> Analytics
56
+ </button>
57
+ </li>
58
+ <li class="nav-item" role="presentation">
59
+ <button class="nav-link" id="tab-review"
60
+ data-bs-toggle="pill" data-bs-target="#step-review"
61
+ type="button" role="tab">
62
+ <i class="bi bi-file-earmark-code"></i> Review
63
+ </button>
64
+ </li>
65
+ </ul>
66
+
67
+ <!-- ============================================================ -->
68
+ <!-- Step Panels -->
69
+ <!-- ============================================================ -->
70
+ <div class="tab-content" id="wizardTabContent">
71
+
72
+ <!-- ───── Step 1: Identity ───── -->
73
+ <div class="tab-pane fade show active" id="step-identity" role="tabpanel">
74
+ <div class="card">
75
+ <div class="card-body">
76
+ <h4 class="card-title mb-3">Site Identity</h4>
77
+
78
+ <div class="mb-3">
79
+ <label for="cfg-title" class="form-label">Site Title</label>
80
+ <input type="text" class="form-control cfg-field" id="cfg-title"
81
+ placeholder="My Awesome Site" data-key="title">
82
+ </div>
83
+
84
+ <div class="mb-3">
85
+ <label for="cfg-subtitle" class="form-label">Subtitle <small class="text-muted">(optional)</small></label>
86
+ <input type="text" class="form-control cfg-field" id="cfg-subtitle"
87
+ placeholder="A short tagline" data-key="subtitle">
88
+ </div>
89
+
90
+ <div class="mb-3">
91
+ <label for="cfg-description" class="form-label">Description <small class="text-muted">(SEO, ≤ 160 chars)</small></label>
92
+ <textarea class="form-control cfg-field" id="cfg-description" rows="2"
93
+ maxlength="160" data-key="description"
94
+ placeholder="Brief description of your site for search engines"></textarea>
95
+ <div class="form-text"><span id="desc-count">0</span>/160</div>
96
+ </div>
97
+
98
+ <div class="row">
99
+ <div class="col-md-6 mb-3">
100
+ <label for="cfg-author" class="form-label">Author / Owner</label>
101
+ <input type="text" class="form-control cfg-field" id="cfg-author"
102
+ placeholder="Your Name" data-key="founder">
103
+ </div>
104
+ <div class="col-md-6 mb-3">
105
+ <label for="cfg-email" class="form-label">Email</label>
106
+ <input type="email" class="form-control cfg-field" id="cfg-email"
107
+ placeholder="you@example.com" data-key="email">
108
+ </div>
109
+ </div>
110
+
111
+ <div class="mb-3">
112
+ <label for="cfg-github-user" class="form-label">GitHub Username</label>
113
+ <input type="text" class="form-control cfg-field" id="cfg-github-user"
114
+ placeholder="your-username" data-key="github_user">
115
+ </div>
116
+
117
+ <div class="mb-3">
118
+ <label for="cfg-repo-name" class="form-label">Repository Name</label>
119
+ <input type="text" class="form-control cfg-field" id="cfg-repo-name"
120
+ placeholder="my-site" data-key="repository_name">
121
+ <div class="form-text">The GitHub repository name for this site (e.g. <code>my-site</code>).</div>
122
+ </div>
123
+
124
+ <div class="text-end">
125
+ <button class="btn btn-primary btn-next" data-next="tab-urls">
126
+ Next: URLs <i class="bi bi-arrow-right"></i>
127
+ </button>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ <!-- ───── Step 2: URLs ───── -->
134
+ <div class="tab-pane fade" id="step-urls" role="tabpanel">
135
+ <div class="card">
136
+ <div class="card-body">
137
+ <h4 class="card-title mb-3">URLs &amp; Deployment</h4>
138
+
139
+ <div class="mb-3">
140
+ <label for="cfg-url" class="form-label">Site URL</label>
141
+ <input type="url" class="form-control cfg-field" id="cfg-url"
142
+ placeholder="https://yourdomain.com" data-key="url">
143
+ <div class="form-text">Your production URL. For GitHub Pages: <code>https://USERNAME.github.io</code></div>
144
+ </div>
145
+
146
+ <div class="mb-3">
147
+ <label for="cfg-baseurl" class="form-label">Base URL <small class="text-muted">(path prefix)</small></label>
148
+ <input type="text" class="form-control cfg-field" id="cfg-baseurl"
149
+ placeholder="/repo-name" data-key="baseurl">
150
+ <div class="form-text">Leave empty for apex domains. Use <code>/repo-name</code> for project pages.</div>
151
+ </div>
152
+
153
+ <div class="mb-3">
154
+ <label for="cfg-remote-theme" class="form-label">Remote Theme</label>
155
+ <input type="text" class="form-control cfg-field" id="cfg-remote-theme"
156
+ value="bamr87/zer0-mistakes" data-key="remote_theme">
157
+ <div class="form-text">Used by GitHub Pages. Set to <code>false</code> for local development.</div>
158
+ </div>
159
+
160
+ <div class="mb-3">
161
+ <label for="cfg-permalink" class="form-label">Permalink Style</label>
162
+ <select class="form-select cfg-field" id="cfg-permalink" data-key="permalink">
163
+ <option value="/:categories/:title/">/:categories/:title/</option>
164
+ <option value="/blog/:year/:month/:day/:title/">Date-based</option>
165
+ <option value="/:title/">Title only</option>
166
+ <option value="pretty">Pretty (/:categories/:year/:month/:day/:title/)</option>
167
+ </select>
168
+ </div>
169
+
170
+ <div class="d-flex justify-content-between">
171
+ <button class="btn btn-outline-secondary btn-prev" data-prev="tab-identity">
172
+ <i class="bi bi-arrow-left"></i> Back
173
+ </button>
174
+ <button class="btn btn-primary btn-next" data-next="tab-collections">
175
+ Next: Collections <i class="bi bi-arrow-right"></i>
176
+ </button>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+
182
+ <!-- ───── Step 3: Collections ───── -->
183
+ <div class="tab-pane fade" id="step-collections" role="tabpanel">
184
+ <div class="card">
185
+ <div class="card-body">
186
+ <h4 class="card-title mb-3">Content Collections</h4>
187
+ <p class="text-muted">Toggle which content collections to enable.</p>
188
+
189
+ <div class="form-check form-switch mb-3">
190
+ <input class="form-check-input cfg-collection" type="checkbox" id="col-posts" checked data-col="posts">
191
+ <label class="form-check-label" for="col-posts">
192
+ <strong>Blog Posts</strong> — <code>pages/_posts/</code>
193
+ </label>
194
+ </div>
195
+
196
+ <div class="form-check form-switch mb-3">
197
+ <input class="form-check-input cfg-collection" type="checkbox" id="col-docs" checked data-col="docs">
198
+ <label class="form-check-label" for="col-docs">
199
+ <strong>Documentation</strong> — <code>pages/_docs/</code>
200
+ </label>
201
+ </div>
202
+
203
+ <div class="form-check form-switch mb-3">
204
+ <input class="form-check-input cfg-collection" type="checkbox" id="col-about" checked data-col="about">
205
+ <label class="form-check-label" for="col-about">
206
+ <strong>About Pages</strong> — <code>pages/_about/</code>
207
+ </label>
208
+ </div>
209
+
210
+ <div class="form-check form-switch mb-3">
211
+ <input class="form-check-input cfg-collection" type="checkbox" id="col-notes" data-col="notes">
212
+ <label class="form-check-label" for="col-notes">
213
+ <strong>Notes</strong> — <code>pages/_notes/</code>
214
+ </label>
215
+ </div>
216
+
217
+ <div class="form-check form-switch mb-3">
218
+ <input class="form-check-input cfg-collection" type="checkbox" id="col-notebooks" data-col="notebooks">
219
+ <label class="form-check-label" for="col-notebooks">
220
+ <strong>Notebooks</strong> — <code>pages/_notebooks/</code>
221
+ </label>
222
+ </div>
223
+
224
+ <div class="d-flex justify-content-between">
225
+ <button class="btn btn-outline-secondary btn-prev" data-prev="tab-urls">
226
+ <i class="bi bi-arrow-left"></i> Back
227
+ </button>
228
+ <button class="btn btn-primary btn-next" data-next="tab-analytics">
229
+ Next: Analytics <i class="bi bi-arrow-right"></i>
230
+ </button>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+
236
+ <!-- ───── Step 4: Analytics ───── -->
237
+ <div class="tab-pane fade" id="step-analytics" role="tabpanel">
238
+ <div class="card">
239
+ <div class="card-body">
240
+ <h4 class="card-title mb-3">Analytics &amp; Integrations</h4>
241
+
242
+ <div class="mb-3">
243
+ <label for="cfg-ga" class="form-label">Google Analytics ID <small class="text-muted">(optional)</small></label>
244
+ <input type="text" class="form-control cfg-field" id="cfg-ga"
245
+ placeholder="G-XXXXXXXXXX" data-key="google_analytics">
246
+ </div>
247
+
248
+ <div class="mb-4">
249
+ <label class="form-label">PostHog Analytics</label>
250
+ <div class="form-check form-switch mb-2">
251
+ <input class="form-check-input" type="checkbox" id="cfg-posthog-enabled" data-key="posthog.enabled">
252
+ <label class="form-check-label" for="cfg-posthog-enabled">Enable PostHog</label>
253
+ </div>
254
+ <input type="text" class="form-control cfg-field" id="cfg-posthog-key"
255
+ placeholder="phc_your_key_here" data-key="posthog.api_key">
256
+ </div>
257
+
258
+ <div class="mb-3">
259
+ <label class="form-label">Social Links <small class="text-muted">(optional)</small></label>
260
+ <div class="row g-2">
261
+ <div class="col-md-6">
262
+ <div class="input-group">
263
+ <span class="input-group-text"><i class="bi bi-twitter-x"></i></span>
264
+ <input type="text" class="form-control cfg-field" placeholder="username" data-key="twitter_username">
265
+ </div>
266
+ </div>
267
+ <div class="col-md-6">
268
+ <div class="input-group">
269
+ <span class="input-group-text"><i class="bi bi-linkedin"></i></span>
270
+ <input type="text" class="form-control cfg-field" placeholder="username" data-key="linkedin_username">
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </div>
275
+
276
+ <div class="d-flex justify-content-between">
277
+ <button class="btn btn-outline-secondary btn-prev" data-prev="tab-collections">
278
+ <i class="bi bi-arrow-left"></i> Back
279
+ </button>
280
+ <button class="btn btn-primary btn-next" data-next="tab-review">
281
+ Review &amp; Download <i class="bi bi-arrow-right"></i>
282
+ </button>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ </div>
287
+
288
+ <!-- ───── Step 5: Review & Download ───── -->
289
+ <div class="tab-pane fade" id="step-review" role="tabpanel">
290
+ <div class="card">
291
+ <div class="card-body">
292
+ <h4 class="card-title mb-3">Review Your Configuration</h4>
293
+ <p class="text-muted">This is the <code>_config.yml</code> that will be generated. Review it, then download or copy.</p>
294
+
295
+ <div class="position-relative">
296
+ <pre class="bg-dark text-light p-3 rounded" style="max-height:450px;overflow:auto"><code id="yaml-preview">Loading…</code></pre>
297
+ <button class="btn btn-sm btn-outline-light position-absolute top-0 end-0 m-2" id="btn-copy"
298
+ title="Copy to clipboard">
299
+ <i class="bi bi-clipboard"></i>
300
+ </button>
301
+ </div>
302
+
303
+ <div class="d-flex justify-content-between mt-3">
304
+ <button class="btn btn-outline-secondary btn-prev" data-prev="tab-analytics">
305
+ <i class="bi bi-arrow-left"></i> Back
306
+ </button>
307
+ <div>
308
+ <button class="btn btn-outline-primary me-2" id="btn-copy-full">
309
+ <i class="bi bi-clipboard"></i> Copy YAML
310
+ </button>
311
+ <button class="btn btn-primary" id="btn-download">
312
+ <i class="bi bi-download"></i> Download _config.yml
313
+ </button>
314
+ </div>
315
+ </div>
316
+
317
+ <div class="alert alert-info mt-4" role="alert">
318
+ <i class="bi bi-info-circle"></i>
319
+ <strong>Next step:</strong> Replace the <code>_config.yml</code> in your project root with the downloaded file, then restart your dev server.
320
+ </div>
321
+ </div>
322
+ </div>
323
+ </div>
324
+
325
+ </div><!-- /tab-content -->
326
+ </div>
327
+ </div>
328
+ </div>
329
+
330
+ <script src="{{ '/assets/js/setup-wizard.js' | relative_url }}"></script>
@@ -0,0 +1,166 @@
1
+ ---
2
+ layout: root
3
+ ---
4
+ <!--
5
+ ===================================================================
6
+ ADMIN LAYOUT - Administrative and configuration page layout
7
+ ===================================================================
8
+
9
+ File: admin.html
10
+ Path: _layouts/admin.html
11
+ Inherits: root.html
12
+ Purpose: Dedicated layout for administrative, settings, and
13
+ configuration utility pages. Provides a dashboard-style
14
+ presentation without article-oriented metadata.
15
+
16
+ Template Logic:
17
+ - Full-width container with optional collapsible admin sidebar
18
+ - Admin header with page icon, title, and breadcrumb navigation
19
+ - No author byline, reading time, or share buttons
20
+ - Responsive: sidebar collapses to offcanvas on mobile
21
+ - Supports front matter: icon, admin_nav (true/false)
22
+
23
+ Front Matter Variables:
24
+ - icon: Bootstrap Icon class for header (e.g., "bi-gear")
25
+ - admin_nav: Show admin sidebar navigation (default: true)
26
+ - admin_section: Active section name for sidebar highlighting
27
+ - admin_actions: Array of {label, url, icon, style} for header buttons
28
+
29
+ Layout Structure:
30
+ 1. Admin header with breadcrumbs, icon, title, description, actions
31
+ 2. Optional admin sidebar with navigation links (data-driven)
32
+ 3. Full-width main content area
33
+
34
+ Dependencies:
35
+ - Bootstrap 5 grid, offcanvas, nav components
36
+ - Bootstrap Icons
37
+ ===================================================================
38
+ -->
39
+
40
+ {% comment %} ════════════════════════════════════════════════════════ {% endcomment %}
41
+ {% comment %} ADMIN NAV DATA {% endcomment %}
42
+ {% comment %} Collect pages in the about collection that have {% endcomment %}
43
+ {% comment %} admin_nav_order set, or fall back to a sensible list. {% endcomment %}
44
+ {% comment %} ════════════════════════════════════════════════════════ {% endcomment %}
45
+
46
+ {% assign show_sidebar = page.admin_nav | default: true %}
47
+
48
+ <!-- ================================================ -->
49
+ <!-- ADMIN PAGE HEADER -->
50
+ <!-- Breadcrumbs + title bar (no author/read-time) -->
51
+ <!-- ================================================ -->
52
+ <div class="bg-body-tertiary border-bottom">
53
+ <div class="container-xxl py-3">
54
+ <!-- Breadcrumbs -->
55
+ <nav aria-label="breadcrumb">
56
+ <ol class="breadcrumb mb-2 small">
57
+ <li class="breadcrumb-item"><a href="{{ '/' | relative_url }}"><i class="bi bi-house-door"></i> Home</a></li>
58
+ <li class="breadcrumb-item"><a href="{{ '/about/' | relative_url }}">About</a></li>
59
+ <li class="breadcrumb-item active" aria-current="page">{{ page.title }}</li>
60
+ </ol>
61
+ </nav>
62
+
63
+ <!-- Title row -->
64
+ <div class="d-flex align-items-center">
65
+ {% if page.icon %}
66
+ <i class="{{ page.icon }} fs-2 me-3 text-primary"></i>
67
+ {% else %}
68
+ <i class="bi bi-gear fs-2 me-3 text-primary"></i>
69
+ {% endif %}
70
+ <div class="me-auto">
71
+ <h1 class="h3 mb-0">{{ page.title }}</h1>
72
+ {% if page.excerpt and page.excerpt != empty %}
73
+ <p class="text-body-secondary mb-0 small">{{ page.excerpt | strip_html }}</p>
74
+ {% endif %}
75
+ {% if page.lastmod %}
76
+ <small class="text-body-tertiary"><i class="bi bi-clock me-1"></i>Updated {{ page.lastmod | date: "%b %d, %Y" }}</small>
77
+ {% endif %}
78
+ </div>
79
+
80
+ <!-- Page-level action buttons (from front matter admin_actions) -->
81
+ {% if page.admin_actions %}
82
+ <div class="d-none d-md-flex gap-2 ms-3">
83
+ {% for action in page.admin_actions %}
84
+ <a href="{{ action.url | relative_url }}"
85
+ class="btn btn-sm {{ action.style | default: 'btn-outline-secondary' }}">
86
+ {% if action.icon %}<i class="{{ action.icon }} me-1"></i>{% endif %}
87
+ {{ action.label }}
88
+ </a>
89
+ {% endfor %}
90
+ </div>
91
+ {% endif %}
92
+
93
+ <!-- Mobile sidebar toggle -->
94
+ {% if show_sidebar %}
95
+ <button class="btn btn-outline-secondary ms-3 d-lg-none"
96
+ type="button"
97
+ data-bs-toggle="offcanvas"
98
+ data-bs-target="#adminSidebar"
99
+ aria-controls="adminSidebar"
100
+ aria-label="Toggle admin navigation">
101
+ <i class="bi bi-list"></i>
102
+ </button>
103
+ {% endif %}
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ <!-- ================================================ -->
109
+ <!-- MAIN LAYOUT: SIDEBAR + CONTENT -->
110
+ <!-- ================================================ -->
111
+ <div class="container-xxl py-4">
112
+ <div class="row">
113
+
114
+ {% if show_sidebar %}
115
+ <!-- ════════════════════════════════ -->
116
+ <!-- ADMIN SIDEBAR -->
117
+ <!-- Desktop: sticky column -->
118
+ <!-- Mobile: offcanvas -->
119
+ <!-- ════════════════════════════════ -->
120
+
121
+ <!-- Desktop sidebar (lg+) -->
122
+ <div class="col-lg-3 d-none d-lg-block">
123
+ <div class="position-sticky" style="top: 5rem;">
124
+ <nav class="admin-sidebar" aria-label="Admin navigation">
125
+ <h6 class="text-uppercase text-body-secondary fw-semibold small mb-3">
126
+ <i class="bi bi-sliders me-1"></i> Administration
127
+ </h6>
128
+ {% include navigation/admin-nav.html %}
129
+ </nav>
130
+ </div>
131
+ </div>
132
+
133
+ <!-- Mobile offcanvas sidebar -->
134
+ <div class="offcanvas offcanvas-start d-lg-none" tabindex="-1"
135
+ id="adminSidebar" aria-labelledby="adminSidebarLabel">
136
+ <div class="offcanvas-header">
137
+ <h5 class="offcanvas-title" id="adminSidebarLabel">
138
+ <i class="bi bi-sliders me-1"></i> Administration
139
+ </h5>
140
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
141
+ </div>
142
+ <div class="offcanvas-body">
143
+ {% include navigation/admin-nav.html %}
144
+ </div>
145
+ </div>
146
+
147
+ <!-- Main content area (with sidebar) -->
148
+ <div class="col-lg-9">
149
+ <div id="admin-content">
150
+ {{ content }}
151
+ </div>
152
+ </div>
153
+
154
+ {% else %}
155
+
156
+ <!-- Full-width content (no sidebar) -->
157
+ <div class="col-12">
158
+ <div id="admin-content">
159
+ {{ content }}
160
+ </div>
161
+ </div>
162
+
163
+ {% endif %}
164
+
165
+ </div>
166
+ </div>
@@ -47,13 +47,13 @@ layout: root
47
47
  <!-- ================================ -->
48
48
  <!-- HERO SECTION -->
49
49
  <!-- ================================ -->
50
- <div class="bg-primary text-white position-relative overflow-hidden">
50
+ <div class="bg-primary zer0-bg-hero text-white position-relative overflow-hidden landing-hero">
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-1">
54
- <h1 class="display-4 fw-bold mb-3 animate-on-scroll">{{ page.title }}</h1>
55
- <p class="lead mb-4 animate-on-scroll" style="animation-delay: 0.1s;">{{ page.description }}</p>
56
- <div class="d-flex flex-column flex-md-row gap-3 animate-on-scroll" style="animation-delay: 0.2s;">
53
+ <div class="col-lg-6 order-1 landing-hero-copy">
54
+ <h1 class="display-4 fw-bold mb-3">{{ page.title }}</h1>
55
+ <p class="lead mb-4">{{ page.description }}</p>
56
+ <div class="d-flex flex-column flex-md-row gap-3 flex-wrap">
57
57
  <a href="#get-started" class="btn btn-light btn-lg">
58
58
  <i class="bi bi-rocket-takeoff me-2"></i>Get Started
59
59
  </a>
@@ -67,11 +67,25 @@ layout: root
67
67
  </div>
68
68
  <div class="col-lg-6 text-center order-2">
69
69
  {% if page.hero_image %}
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;">
70
+ <div class="landing-hero-media ratio ratio-4x3 mx-auto shadow-lg rounded overflow-hidden">
71
+ <img
72
+ src="{{ page.hero_image | relative_url }}"
73
+ alt="{{ page.title }}"
74
+ class="w-100 h-100"
75
+ width="800"
76
+ height="600"
77
+ loading="eager"
78
+ decoding="async"
79
+ fetchpriority="high"
80
+ style="object-fit: contain;"
81
+ >
82
+ </div>
71
83
  {% else %}
72
- <div class="bg-secondary rounded p-5 text-body animate-on-scroll">
73
- <i class="bi bi-code-square display-1"></i>
74
- <p class="mt-3 mb-0">Jekyll Theme</p>
84
+ <div class="landing-hero-media ratio ratio-4x3 mx-auto shadow-lg rounded overflow-hidden">
85
+ <div class="position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center bg-secondary bg-opacity-25 text-body rounded">
86
+ <i class="bi bi-code-square display-1"></i>
87
+ <p class="mt-3 mb-0 px-3">Jekyll Theme</p>
88
+ </div>
75
89
  </div>
76
90
  {% endif %}
77
91
  </div>
data/_layouts/root.html CHANGED
@@ -31,7 +31,7 @@
31
31
  -->
32
32
 
33
33
  <!doctype html>
34
- <html lang="{{ site.locale | slice: 0,2 | default: 'en' }}" class="no-js" data-bs-theme="dark">
34
+ <html lang="{{ site.locale | slice: 0,2 | default: 'en' }}" class="no-js" data-bs-theme="dark" data-theme-skin="{{ site.theme_skin | default: 'dark' }}" data-zer0-bg="{{ site.theme_background.enabled | default: true }}">
35
35
  <head>
36
36
  <!-- =============================================== -->
37
37
  <!-- HEAD SECTION: Meta tags, styles, and SEO setup -->
@@ -43,15 +43,18 @@
43
43
  <!-- Jekyll SEO plugin for enhanced search engine optimization -->
44
44
  <!-- Documentation: https://github.com/jekyll/jekyll-seo-tag -->
45
45
  {% seo %}
46
+
47
+ <!-- fffuel-style SVG background config overrides -->
48
+ {% include components/svg-background.html zone="body" %}
46
49
  </head>
47
50
 
48
- <body data-bs-spy="scroll" data-bs-target="#TableOfContents">
51
+ <body class="zer0-bg-body" data-bs-spy="scroll" data-bs-target="#TableOfContents">
49
52
  <!-- ============================================== -->
50
53
  <!-- BODY SECTION: Site structure and content area -->
51
54
  <!-- ============================================== -->
52
55
 
53
56
  <!-- Inline SVG symbols for consistent iconography throughout the site -->
54
- {% include_cached components/svg.html %}
57
+ {% include components/svg.html %}
55
58
 
56
59
  <!-- Google Tag Manager body code for analytics (if configured) -->
57
60
  <!-- Note: Currently commented out - uncomment when GTM is needed -->
@@ -60,11 +63,14 @@
60
63
  {% include core/header.html %}
61
64
 
62
65
  <!-- Search modal (site-wide) -->
63
- {% include_cached components/search-modal.html %}
66
+ {% include components/search-modal.html %}
64
67
 
65
68
  <!-- Site-wide information banner or announcement section -->
66
69
  {% include components/info-section.html %}
67
70
 
71
+ <!-- Setup banner for unconfigured sites -->
72
+ {% include components/setup-banner.html %}
73
+
68
74
  <!-- ======================== -->
69
75
  <!-- MAIN CONTENT AREA -->
70
76
  <!-- ======================== -->
@@ -81,7 +87,7 @@
81
87
  {%- include core/footer.html -%}
82
88
 
83
89
  <!-- Privacy-compliant cookie consent banner -->
84
- {%- include_cached components/cookie-consent.html -%}
90
+ {%- include components/cookie-consent.html -%}
85
91
 
86
92
  <!-- JavaScript dependencies and custom scripts -->
87
93
  <div>
@@ -89,7 +95,7 @@
89
95
  <!-- Note: Currently commented out - uncomment when search is implemented -->
90
96
 
91
97
  <!-- External JavaScript libraries and custom scripts -->
92
- {% include_cached components/js-cdn.html %}
98
+ {% include components/js-cdn.html %}
93
99
  </div>
94
100
 
95
101
  <!-- Analytics Integration -->