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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +236 -0
- data/README.md +66 -19
- data/_data/navigation/admin.yml +53 -0
- data/_data/theme_backgrounds.yml +121 -0
- data/_includes/components/admin-tabs.html +59 -0
- data/_includes/components/analytics-dashboard.html +232 -0
- data/_includes/components/background-customizer.html +159 -0
- data/_includes/components/background-settings.html +137 -0
- data/_includes/components/collection-manager.html +151 -0
- data/_includes/components/component-showcase.html +452 -0
- data/_includes/components/config-editor.html +207 -0
- data/_includes/components/config-viewer.html +479 -0
- data/_includes/components/env-dashboard.html +154 -0
- data/_includes/components/feature-card.html +94 -0
- data/_includes/components/info-section.html +172 -149
- data/_includes/components/js-cdn.html +4 -1
- data/_includes/components/nav-editor.html +99 -0
- data/_includes/components/setup-banner.html +28 -0
- data/_includes/components/setup-check.html +53 -0
- data/_includes/components/svg-background.html +42 -0
- data/_includes/components/theme-customizer.html +46 -0
- data/_includes/content/seo.html +68 -135
- data/_includes/core/footer.html +1 -1
- data/_includes/core/head.html +3 -2
- data/_includes/core/header.html +14 -7
- data/_includes/landing/landing-install-cards.html +18 -7
- data/_includes/navigation/admin-nav.html +95 -0
- data/_includes/navigation/navbar.html +43 -5
- data/_includes/navigation/sidebar-left.html +1 -1
- data/_includes/setup/wizard.html +330 -0
- data/_layouts/admin.html +166 -0
- data/_layouts/landing.html +23 -9
- data/_layouts/root.html +12 -6
- data/_layouts/setup.html +73 -0
- data/_plugins/preview_image_generator.rb +26 -12
- data/_sass/core/_navbar.scss +2 -2
- data/_sass/custom.scss +28 -6
- data/_sass/theme/_background-mixins.scss +95 -0
- data/_sass/theme/_backgrounds.scss +156 -0
- data/_sass/theme/_color-modes.scss +2 -1
- data/assets/backgrounds/gradients/air.svg +15 -0
- data/assets/backgrounds/gradients/aqua.svg +15 -0
- data/assets/backgrounds/gradients/contrast.svg +15 -0
- data/assets/backgrounds/gradients/dark.svg +15 -0
- data/assets/backgrounds/gradients/dirt.svg +15 -0
- data/assets/backgrounds/gradients/mint.svg +15 -0
- data/assets/backgrounds/gradients/neon.svg +15 -0
- data/assets/backgrounds/gradients/plum.svg +15 -0
- data/assets/backgrounds/gradients/sunrise.svg +15 -0
- data/assets/backgrounds/noise/air.svg +8 -0
- data/assets/backgrounds/noise/aqua.svg +8 -0
- data/assets/backgrounds/noise/contrast.svg +8 -0
- data/assets/backgrounds/noise/dark.svg +8 -0
- data/assets/backgrounds/noise/dirt.svg +8 -0
- data/assets/backgrounds/noise/mint.svg +8 -0
- data/assets/backgrounds/noise/neon.svg +8 -0
- data/assets/backgrounds/noise/plum.svg +8 -0
- data/assets/backgrounds/noise/sunrise.svg +8 -0
- data/assets/backgrounds/patterns/air.svg +7 -0
- data/assets/backgrounds/patterns/aqua.svg +7 -0
- data/assets/backgrounds/patterns/contrast.svg +4 -0
- data/assets/backgrounds/patterns/dark.svg +5 -0
- data/assets/backgrounds/patterns/dirt.svg +5 -0
- data/assets/backgrounds/patterns/mint.svg +6 -0
- data/assets/backgrounds/patterns/neon.svg +6 -0
- data/assets/backgrounds/patterns/plum.svg +6 -0
- data/assets/backgrounds/patterns/sunrise.svg +5 -0
- data/assets/js/background-customizer.js +73 -0
- data/assets/js/code-copy.js +18 -47
- data/assets/js/config-utility.js +307 -0
- data/assets/js/nav-editor.js +39 -0
- data/assets/js/palette-generator.js +415 -0
- data/assets/js/search-modal.js +31 -11
- data/assets/js/setup-wizard.js +306 -0
- data/assets/js/skin-editor.js +645 -0
- data/assets/js/theme-customizer.js +102 -0
- data/assets/js/ui-enhancements.js +15 -24
- data/assets/vendor/bootstrap/css/bootstrap.min.css +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +1 -0
- data/scripts/README.md +45 -0
- data/scripts/features/generate-preview-images +297 -7
- data/scripts/features/install-preview-generator +51 -33
- data/scripts/fork-cleanup.sh +92 -19
- data/scripts/github-setup.sh +284 -0
- data/scripts/init_setup.sh +0 -1
- data/scripts/lib/frontmatter.sh +543 -0
- data/scripts/lib/migrate.sh +265 -0
- data/scripts/lib/preview_generator.py +607 -32
- data/scripts/lint-pages +505 -0
- data/scripts/migrate.sh +201 -0
- data/scripts/platform/setup-linux.sh +244 -0
- data/scripts/platform/setup-macos.sh +187 -0
- data/scripts/platform/setup-wsl.sh +196 -0
- 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 & 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 & 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 & 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>
|
data/_layouts/admin.html
ADDED
|
@@ -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>
|
data/_layouts/landing.html
CHANGED
|
@@ -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
|
|
55
|
-
<p class="lead mb-4
|
|
56
|
-
<div class="d-flex flex-column flex-md-row gap-3
|
|
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
|
-
<
|
|
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="
|
|
73
|
-
<
|
|
74
|
-
|
|
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
|
-
{%
|
|
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
|
-
{%
|
|
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
|
-
{%-
|
|
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
|
-
{%
|
|
98
|
+
{% include components/js-cdn.html %}
|
|
93
99
|
</div>
|
|
94
100
|
|
|
95
101
|
<!-- Analytics Integration -->
|