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,94 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
===================================================================
|
|
3
|
+
FEATURE CARD - Data-driven feature display from features.yml
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: feature-card.html
|
|
7
|
+
Path: _includes/components/feature-card.html
|
|
8
|
+
Purpose: Reusable card component that renders a single feature from
|
|
9
|
+
the _data/features.yml registry. Used by the features page,
|
|
10
|
+
news index, documentation, and any page that needs to
|
|
11
|
+
display feature information consistently.
|
|
12
|
+
|
|
13
|
+
Parameters:
|
|
14
|
+
- feature (hash) : A single feature object from site.data.features.features (required)
|
|
15
|
+
- style (string) : Card border color class — "primary", "success", "info", etc. (optional, default: none)
|
|
16
|
+
- icon (string) : Bootstrap Icon class, e.g. "bi-rocket-takeoff" (optional, default: "bi-check-circle-fill")
|
|
17
|
+
- icon_color (string): Icon text-color class, e.g. "text-success" (optional, default: "text-success")
|
|
18
|
+
- show_refs (bool) : Show file references list (optional, default: false)
|
|
19
|
+
- compact (bool) : Compact mode — hides sub-features list (optional, default: false)
|
|
20
|
+
- features_limit (int) : Max sub-features shown in the list (optional, default: 5)
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
{% assign f = site.data.features.features | where: "id", "ZER0-001" | first %}
|
|
24
|
+
{% include components/feature-card.html feature=f style="primary" icon="bi-bootstrap" icon_color="text-primary" %}
|
|
25
|
+
===================================================================
|
|
26
|
+
-->
|
|
27
|
+
{% assign f = include.feature %}
|
|
28
|
+
{% assign border = include.style %}
|
|
29
|
+
{% assign icon = include.icon | default: "bi-check-circle-fill" %}
|
|
30
|
+
{% assign icon_color = include.icon_color | default: "text-success" %}
|
|
31
|
+
{% assign show_refs = include.show_refs | default: false %}
|
|
32
|
+
{% assign compact = include.compact | default: false %}
|
|
33
|
+
{% assign features_limit = include.features_limit | default: 5 %}
|
|
34
|
+
<div class="card h-100 {% unless border == blank %}border-{{ border }}{% endunless %}">
|
|
35
|
+
<div class="card-body">
|
|
36
|
+
<h5 class="card-title">
|
|
37
|
+
<i class="bi {{ icon }} {{ icon_color }} me-2"></i>
|
|
38
|
+
{{ f.title }}
|
|
39
|
+
</h5>
|
|
40
|
+
<p class="card-text">{{ f.description }}</p>
|
|
41
|
+
|
|
42
|
+
{% unless compact %}
|
|
43
|
+
{% if f.features %}
|
|
44
|
+
<div class="mt-3">
|
|
45
|
+
<h6 class="text-muted small">Key Features:</h6>
|
|
46
|
+
<ul class="small mb-0">
|
|
47
|
+
{% for item in f.features limit:features_limit %}
|
|
48
|
+
<li>{{ item }}</li>
|
|
49
|
+
{% endfor %}
|
|
50
|
+
</ul>
|
|
51
|
+
</div>
|
|
52
|
+
{% endif %}
|
|
53
|
+
{% endunless %}
|
|
54
|
+
|
|
55
|
+
{% if show_refs and f.references %}
|
|
56
|
+
<div class="mt-3">
|
|
57
|
+
<h6 class="text-muted small">References:</h6>
|
|
58
|
+
<ul class="small mb-0">
|
|
59
|
+
{% for ref in f.references %}
|
|
60
|
+
{% assign key = ref[0] %}
|
|
61
|
+
{% assign value = ref[1] %}
|
|
62
|
+
{% if value.first %}
|
|
63
|
+
{% for file in value %}
|
|
64
|
+
<li><code>{{ file }}</code></li>
|
|
65
|
+
{% endfor %}
|
|
66
|
+
{% else %}
|
|
67
|
+
<li><code>{{ value }}</code></li>
|
|
68
|
+
{% endif %}
|
|
69
|
+
{% endfor %}
|
|
70
|
+
</ul>
|
|
71
|
+
</div>
|
|
72
|
+
{% endif %}
|
|
73
|
+
|
|
74
|
+
<div class="mt-3">
|
|
75
|
+
<span class="badge bg-primary">{{ f.id }}</span>
|
|
76
|
+
<span class="badge bg-secondary">v{{ f.version }}</span>
|
|
77
|
+
{% for tag in f.tags limit:3 %}
|
|
78
|
+
<span class="badge bg-light text-dark">{{ tag }}</span>
|
|
79
|
+
{% endfor %}
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
{% if f.docs %}
|
|
83
|
+
<div class="card-footer">
|
|
84
|
+
<a href="{{ f.docs }}" class="btn btn-sm btn-outline-{% unless border == blank %}{{ border }}{% else %}primary{% endunless %}">
|
|
85
|
+
<i class="bi bi-book me-1"></i>Documentation
|
|
86
|
+
</a>
|
|
87
|
+
{% if f.link and f.link != "/" %}
|
|
88
|
+
<a href="{{ f.link }}" class="btn btn-sm btn-outline-secondary ms-1">
|
|
89
|
+
<i class="bi bi-box-arrow-up-right me-1"></i>Demo
|
|
90
|
+
</a>
|
|
91
|
+
{% endif %}
|
|
92
|
+
</div>
|
|
93
|
+
{% endif %}
|
|
94
|
+
</div>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
===================================================================
|
|
3
|
-
INFO SECTION - Settings
|
|
3
|
+
INFO SECTION - Settings Offcanvas with Tabbed Interface
|
|
4
4
|
===================================================================
|
|
5
5
|
|
|
6
6
|
File: info-section.html
|
|
7
7
|
Path: _includes/components/info-section.html
|
|
8
|
-
Purpose: Unified settings
|
|
8
|
+
Purpose: Unified settings offcanvas panel with tabs for Settings, Environment, Developer
|
|
9
9
|
|
|
10
10
|
Dependencies:
|
|
11
|
-
- Bootstrap 5
|
|
11
|
+
- Bootstrap 5 Offcanvas, Tabs
|
|
12
12
|
- _includes/components/env-switcher.html
|
|
13
13
|
- _includes/components/theme-info.html
|
|
14
14
|
- _includes/components/dev-shortcuts.html
|
|
@@ -16,167 +16,190 @@
|
|
|
16
16
|
- _includes/navigation/breadcrumbs.html
|
|
17
17
|
|
|
18
18
|
References:
|
|
19
|
-
- https://getbootstrap.com/docs/5.3/components/
|
|
19
|
+
- https://getbootstrap.com/docs/5.3/components/offcanvas/
|
|
20
20
|
- https://getbootstrap.com/docs/5.3/components/navs-tabs/
|
|
21
21
|
===================================================================
|
|
22
22
|
-->
|
|
23
23
|
|
|
24
24
|
{% include components/env-detect.html %}
|
|
25
|
-
<!-- Settings
|
|
26
|
-
<div class="
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
<!-- Settings Offcanvas -->
|
|
26
|
+
<div class="offcanvas offcanvas-end" tabindex="-1" id="info-section" aria-labelledby="infoSectionLabel">
|
|
27
|
+
|
|
28
|
+
<!-- Offcanvas Header -->
|
|
29
|
+
<div class="offcanvas-header border-bottom pb-0 d-block">
|
|
30
|
+
<div class="d-flex align-items-center justify-content-between mb-2">
|
|
31
|
+
<h5 class="offcanvas-title" id="infoSectionLabel">
|
|
32
|
+
<i class="bi bi-gear-wide-connected me-2"></i>Settings
|
|
33
|
+
</h5>
|
|
34
|
+
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<!-- Tab Navigation -->
|
|
38
|
+
<ul class="nav nav-tabs" id="infoTabs" role="tablist">
|
|
39
|
+
<li class="nav-item" role="presentation">
|
|
40
|
+
<button class="nav-link active" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings-pane" type="button" role="tab" aria-controls="settings-pane" aria-selected="true">
|
|
41
|
+
<i class="bi bi-sliders me-1"></i>
|
|
42
|
+
<span class="d-none d-sm-inline">Settings</span>
|
|
43
|
+
</button>
|
|
44
|
+
</li>
|
|
45
|
+
<li class="nav-item" role="presentation">
|
|
46
|
+
<button class="nav-link" id="environment-tab" data-bs-toggle="tab" data-bs-target="#environment-pane" type="button" role="tab" aria-controls="environment-pane" aria-selected="false">
|
|
47
|
+
<i class="bi bi-hdd-network me-1"></i>
|
|
48
|
+
<span class="d-none d-sm-inline">Environment</span>
|
|
49
|
+
{% if is_production %}
|
|
50
|
+
<span class="badge bg-success ms-1 d-none d-md-inline-block">Prod</span>
|
|
51
|
+
{% else %}
|
|
52
|
+
<span class="badge bg-warning text-dark ms-1 d-none d-md-inline-block">Dev</span>
|
|
53
|
+
{% endif %}
|
|
54
|
+
</button>
|
|
55
|
+
</li>
|
|
56
|
+
<li class="nav-item" role="presentation">
|
|
57
|
+
<button class="nav-link" id="developer-tab" data-bs-toggle="tab" data-bs-target="#developer-pane" type="button" role="tab" aria-controls="developer-pane" aria-selected="false">
|
|
58
|
+
<i class="bi bi-code-slash me-1"></i>
|
|
59
|
+
<span class="d-none d-sm-inline">Developer</span>
|
|
60
|
+
</button>
|
|
61
|
+
</li>
|
|
62
|
+
<li class="nav-item" role="presentation">
|
|
63
|
+
<button class="nav-link" id="background-tab" data-bs-toggle="tab" data-bs-target="#background-pane" type="button" role="tab" aria-controls="background-pane" aria-selected="false">
|
|
64
|
+
<i class="bi bi-palette2 me-1"></i>
|
|
65
|
+
<span class="d-none d-sm-inline">Background</span>
|
|
66
|
+
</button>
|
|
67
|
+
</li>
|
|
68
|
+
</ul>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<!-- Offcanvas Body with Tab Content -->
|
|
72
|
+
<div class="offcanvas-body">
|
|
73
|
+
<div class="tab-content" id="infoTabContent">
|
|
29
74
|
|
|
30
|
-
<!--
|
|
31
|
-
<div class="
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<!-- Tab Navigation -->
|
|
41
|
-
<ul class="nav nav-tabs" id="infoTabs" role="tablist">
|
|
42
|
-
<li class="nav-item" role="presentation">
|
|
43
|
-
<button class="nav-link active" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings-pane" type="button" role="tab" aria-controls="settings-pane" aria-selected="true">
|
|
44
|
-
<i class="bi bi-sliders me-1"></i>
|
|
45
|
-
<span class="d-none d-sm-inline">Settings</span>
|
|
46
|
-
</button>
|
|
47
|
-
</li>
|
|
48
|
-
<li class="nav-item" role="presentation">
|
|
49
|
-
<button class="nav-link" id="environment-tab" data-bs-toggle="tab" data-bs-target="#environment-pane" type="button" role="tab" aria-controls="environment-pane" aria-selected="false">
|
|
50
|
-
<i class="bi bi-hdd-network me-1"></i>
|
|
51
|
-
<span class="d-none d-sm-inline">Environment</span>
|
|
52
|
-
{% if is_production %}
|
|
53
|
-
<span class="badge bg-success ms-1 d-none d-md-inline-block">Prod</span>
|
|
54
|
-
{% else %}
|
|
55
|
-
<span class="badge bg-warning text-dark ms-1 d-none d-md-inline-block">Dev</span>
|
|
56
|
-
{% endif %}
|
|
57
|
-
</button>
|
|
58
|
-
</li>
|
|
59
|
-
<li class="nav-item" role="presentation">
|
|
60
|
-
<button class="nav-link" id="developer-tab" data-bs-toggle="tab" data-bs-target="#developer-pane" type="button" role="tab" aria-controls="developer-pane" aria-selected="false">
|
|
61
|
-
<i class="bi bi-code-slash me-1"></i>
|
|
62
|
-
<span class="d-none d-sm-inline">Developer</span>
|
|
63
|
-
</button>
|
|
64
|
-
</li>
|
|
65
|
-
</ul>
|
|
75
|
+
<!-- Settings Tab -->
|
|
76
|
+
<div class="tab-pane fade show active" id="settings-pane" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">
|
|
77
|
+
|
|
78
|
+
<!-- Search -->
|
|
79
|
+
<div class="mb-4">
|
|
80
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
81
|
+
<i class="bi bi-search me-1"></i>Search
|
|
82
|
+
</h6>
|
|
83
|
+
{% include components/searchbar.html %}
|
|
66
84
|
</div>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<!-- Search -->
|
|
77
|
-
<div class="mb-4">
|
|
78
|
-
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
79
|
-
<i class="bi bi-search me-1"></i>Search
|
|
80
|
-
</h6>
|
|
81
|
-
{% include components/searchbar.html %}
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
<!-- Theme Toggle -->
|
|
85
|
-
<div class="mb-4">
|
|
86
|
-
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
87
|
-
<i class="bi bi-moon-stars me-1"></i>Appearance
|
|
88
|
-
</h6>
|
|
89
|
-
<div class="d-flex align-items-center justify-content-between p-3 bg-body-tertiary rounded">
|
|
90
|
-
<span>Theme Mode</span>
|
|
91
|
-
{% include components/halfmoon.html %}
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
<!-- Theme Info (Collapsible) -->
|
|
96
|
-
<div class="mb-3">
|
|
97
|
-
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
98
|
-
<i class="bi bi-info-circle me-1"></i>About
|
|
99
|
-
</h6>
|
|
100
|
-
<button class="btn btn-outline-secondary btn-sm w-100 d-flex justify-content-between align-items-center" type="button" data-bs-toggle="collapse" data-bs-target="#themeInfoCollapse" aria-expanded="false" aria-controls="themeInfoCollapse">
|
|
101
|
-
<span>Theme & Build Info</span>
|
|
102
|
-
<i class="bi bi-chevron-down"></i>
|
|
103
|
-
</button>
|
|
104
|
-
<div class="collapse mt-2" id="themeInfoCollapse">
|
|
105
|
-
{% include components/theme-info.html %}
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
85
|
+
|
|
86
|
+
<!-- Theme Toggle -->
|
|
87
|
+
<div class="mb-4">
|
|
88
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
89
|
+
<i class="bi bi-moon-stars me-1"></i>Appearance
|
|
90
|
+
</h6>
|
|
91
|
+
<div class="d-flex align-items-center justify-content-between p-3 bg-body-tertiary rounded">
|
|
92
|
+
<span>Theme Mode</span>
|
|
93
|
+
{% include components/halfmoon.html %}
|
|
108
94
|
</div>
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<!-- Theme Info (Collapsible) -->
|
|
98
|
+
<div class="mb-3">
|
|
99
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
100
|
+
<i class="bi bi-info-circle me-1"></i>About
|
|
101
|
+
</h6>
|
|
102
|
+
<button class="btn btn-outline-secondary btn-sm w-100 d-flex justify-content-between align-items-center" type="button" data-bs-toggle="collapse" data-bs-target="#themeInfoCollapse" aria-expanded="false" aria-controls="themeInfoCollapse">
|
|
103
|
+
<span>Theme & Build Info</span>
|
|
104
|
+
<i class="bi bi-chevron-down"></i>
|
|
105
|
+
</button>
|
|
106
|
+
<div class="collapse mt-2" id="themeInfoCollapse">
|
|
107
|
+
{% include components/theme-info.html %}
|
|
113
108
|
</div>
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
<
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
</
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
{% include components/dev-shortcuts.html %}
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
<!-- Page Metadata -->
|
|
135
|
-
<div class="mb-3">
|
|
136
|
-
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
137
|
-
<i class="bi bi-file-earmark-code me-1"></i>Page Info
|
|
138
|
-
</h6>
|
|
139
|
-
<div class="table-responsive">
|
|
140
|
-
<table class="table table-sm table-hover mb-0 small">
|
|
141
|
-
<tbody>
|
|
142
|
-
<tr>
|
|
143
|
-
<td class="text-body-secondary" style="width: 30%;">Layout</td>
|
|
144
|
-
<td><code>{{ page.layout | default: "none" }}</code></td>
|
|
145
|
-
</tr>
|
|
146
|
-
<tr>
|
|
147
|
-
<td class="text-body-secondary">Collection</td>
|
|
148
|
-
<td><code>{{ page.collection | default: "none" }}</code></td>
|
|
149
|
-
</tr>
|
|
150
|
-
<tr>
|
|
151
|
-
<td class="text-body-secondary">Path</td>
|
|
152
|
-
<td><code class="text-break">{{ page.path }}</code></td>
|
|
153
|
-
</tr>
|
|
154
|
-
<tr>
|
|
155
|
-
<td class="text-body-secondary">URL</td>
|
|
156
|
-
<td><code class="text-break">{{ page.url }}</code></td>
|
|
157
|
-
</tr>
|
|
158
|
-
{% if page.date %}
|
|
159
|
-
<tr>
|
|
160
|
-
<td class="text-body-secondary">Date</td>
|
|
161
|
-
<td><code>{{ page.date | date: "%Y-%m-%d" }}</code></td>
|
|
162
|
-
</tr>
|
|
163
|
-
{% endif %}
|
|
164
|
-
</tbody>
|
|
165
|
-
</table>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<!-- Admin Quick Links -->
|
|
112
|
+
<div class="mb-3">
|
|
113
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
114
|
+
<i class="bi bi-speedometer2 me-1"></i>Admin Dashboard
|
|
115
|
+
</h6>
|
|
116
|
+
<div class="list-group list-group-flush small">
|
|
117
|
+
<a href="{{ '/about/config/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
118
|
+
<i class="bi bi-gear me-2 text-body-secondary"></i>Configuration
|
|
119
|
+
</a>
|
|
120
|
+
<a href="{{ '/about/settings/theme/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
121
|
+
<i class="bi bi-palette me-2 text-body-secondary"></i>Theme Customizer
|
|
122
|
+
</a>
|
|
123
|
+
<a href="{{ '/about/settings/navigation/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
124
|
+
<i class="bi bi-signpost-2 me-2 text-body-secondary"></i>Navigation Editor
|
|
125
|
+
</a>
|
|
168
126
|
</div>
|
|
169
|
-
|
|
170
127
|
</div>
|
|
171
128
|
</div>
|
|
172
129
|
|
|
173
|
-
<!--
|
|
174
|
-
<div class="
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
130
|
+
<!-- Environment Tab -->
|
|
131
|
+
<div class="tab-pane fade" id="environment-pane" role="tabpanel" aria-labelledby="environment-tab" tabindex="0">
|
|
132
|
+
{% include components/env-switcher.html %}
|
|
133
|
+
|
|
134
|
+
<!-- Admin Link -->
|
|
135
|
+
<div class="mt-4 pt-3 border-top">
|
|
136
|
+
<a href="{{ '/about/settings/environment/' | relative_url }}" class="btn btn-outline-secondary btn-sm w-100">
|
|
137
|
+
<i class="bi bi-box-arrow-up-right me-1"></i>Full Environment & Build Info
|
|
138
|
+
</a>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<!-- Developer Tab -->
|
|
143
|
+
<div class="tab-pane fade" id="developer-pane" role="tabpanel" aria-labelledby="developer-tab" tabindex="0">
|
|
144
|
+
|
|
145
|
+
<!-- Page Location -->
|
|
146
|
+
<div class="mb-4">
|
|
147
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
148
|
+
<i class="bi bi-signpost-split me-1"></i>Page Location
|
|
149
|
+
</h6>
|
|
150
|
+
{% include navigation/breadcrumbs.html %}
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<!-- Source Code Shortcuts -->
|
|
154
|
+
<div class="mb-4">
|
|
155
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
156
|
+
<i class="bi bi-code-square me-1"></i>Source Code
|
|
157
|
+
</h6>
|
|
158
|
+
{% include components/dev-shortcuts.html %}
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
<!-- Page Metadata -->
|
|
162
|
+
<div class="mb-3">
|
|
163
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
164
|
+
<i class="bi bi-file-earmark-code me-1"></i>Page Info
|
|
165
|
+
</h6>
|
|
166
|
+
<div class="table-responsive">
|
|
167
|
+
<table class="table table-sm table-hover mb-0 small">
|
|
168
|
+
<tbody>
|
|
169
|
+
<tr>
|
|
170
|
+
<td class="text-body-secondary" style="width: 30%;">Layout</td>
|
|
171
|
+
<td><code>{{ page.layout | default: "none" }}</code></td>
|
|
172
|
+
</tr>
|
|
173
|
+
<tr>
|
|
174
|
+
<td class="text-body-secondary">Collection</td>
|
|
175
|
+
<td><code>{{ page.collection | default: "none" }}</code></td>
|
|
176
|
+
</tr>
|
|
177
|
+
<tr>
|
|
178
|
+
<td class="text-body-secondary">Path</td>
|
|
179
|
+
<td><code class="text-break">{{ page.path }}</code></td>
|
|
180
|
+
</tr>
|
|
181
|
+
<tr>
|
|
182
|
+
<td class="text-body-secondary">URL</td>
|
|
183
|
+
<td><code class="text-break">{{ page.url }}</code></td>
|
|
184
|
+
</tr>
|
|
185
|
+
{% if page.date %}
|
|
186
|
+
<tr>
|
|
187
|
+
<td class="text-body-secondary">Date</td>
|
|
188
|
+
<td><code>{{ page.date | date: "%Y-%m-%d" }}</code></td>
|
|
189
|
+
</tr>
|
|
190
|
+
{% endif %}
|
|
191
|
+
</tbody>
|
|
192
|
+
</table>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
178
195
|
</div>
|
|
179
196
|
|
|
197
|
+
<!-- Background Tab -->
|
|
198
|
+
<div class="tab-pane fade" id="background-pane" role="tabpanel" aria-labelledby="background-tab" tabindex="0">
|
|
199
|
+
{% include components/background-settings.html %}
|
|
200
|
+
</div>
|
|
201
|
+
|
|
180
202
|
</div>
|
|
181
203
|
</div>
|
|
204
|
+
|
|
182
205
|
</div>
|
|
@@ -28,4 +28,7 @@
|
|
|
28
28
|
<script type="module" src="{{ '/assets/js/modules/navigation/index.js' | relative_url }}"></script>
|
|
29
29
|
|
|
30
30
|
<!-- Search modal controller -->
|
|
31
|
-
<script src="{{ '/assets/js/search-modal.js' | relative_url }}"></script>
|
|
31
|
+
<script src="{{ '/assets/js/search-modal.js' | relative_url }}"></script>
|
|
32
|
+
|
|
33
|
+
<!-- fffuel-style background customizer (skin switching, toggle, opacity) -->
|
|
34
|
+
<script src="{{ '/assets/js/background-customizer.js' | relative_url }}"></script>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
===================================================================
|
|
3
|
+
NAV EDITOR — Read-only navigation tree view
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: nav-editor.html
|
|
7
|
+
Path: _includes/components/nav-editor.html
|
|
8
|
+
Purpose: Renders all navigation data files as expandable card trees.
|
|
9
|
+
Each nav file becomes a card; items with children are nested.
|
|
10
|
+
|
|
11
|
+
Dependencies: Bootstrap 5 card/list-group, Bootstrap Icons,
|
|
12
|
+
_data/navigation/*.yml
|
|
13
|
+
Used by: pages/_about/settings/navigation.md
|
|
14
|
+
===================================================================
|
|
15
|
+
-->
|
|
16
|
+
|
|
17
|
+
{% assign nav_files = "main,home,about,docs,posts,quickstart,admin" | split: "," %}
|
|
18
|
+
|
|
19
|
+
<div class="row g-3 mb-3">
|
|
20
|
+
<div class="col-lg-4">
|
|
21
|
+
<div class="card text-center border-primary">
|
|
22
|
+
<div class="card-body py-3">
|
|
23
|
+
<i class="bi bi-signpost-2 fs-3 text-primary"></i>
|
|
24
|
+
<div class="fw-semibold mt-1">{{ nav_files | size }}</div>
|
|
25
|
+
<small class="text-body-secondary">Navigation Files</small>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="col-lg-4">
|
|
30
|
+
<div class="card text-center border-primary">
|
|
31
|
+
<div class="card-body py-3">
|
|
32
|
+
<i class="bi bi-list-nested fs-3 text-primary"></i>
|
|
33
|
+
{% assign total_items = 0 %}
|
|
34
|
+
{% for nf in nav_files %}
|
|
35
|
+
{% assign items = site.data.navigation[nf] %}
|
|
36
|
+
{% if items %}{% assign total_items = total_items | plus: items.size %}{% endif %}
|
|
37
|
+
{% endfor %}
|
|
38
|
+
<div class="fw-semibold mt-1">{{ total_items }}</div>
|
|
39
|
+
<small class="text-body-secondary">Top-Level Items</small>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="col-lg-4">
|
|
44
|
+
<div class="card text-center border-primary">
|
|
45
|
+
<div class="card-body py-3">
|
|
46
|
+
<i class="bi bi-folder2-open fs-3 text-primary"></i>
|
|
47
|
+
<div class="fw-semibold mt-1">_data/navigation/</div>
|
|
48
|
+
<small class="text-body-secondary">Source Directory</small>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="accordion" id="navAccordion">
|
|
55
|
+
{% for nf in nav_files %}
|
|
56
|
+
{% assign items = site.data.navigation[nf] %}
|
|
57
|
+
{% assign nf_id = nf | replace: '.', '-' %}
|
|
58
|
+
<div class="accordion-item">
|
|
59
|
+
<h2 class="accordion-header">
|
|
60
|
+
<button class="accordion-button {% unless forloop.first %}collapsed{% endunless %}" type="button"
|
|
61
|
+
data-bs-toggle="collapse" data-bs-target="#navAcc-{{ nf_id }}">
|
|
62
|
+
<i class="bi bi-file-earmark-text me-2"></i>
|
|
63
|
+
<strong>{{ nf }}.yml</strong>
|
|
64
|
+
{% if items %}
|
|
65
|
+
<span class="badge bg-secondary ms-2">{{ items | size }} items</span>
|
|
66
|
+
{% else %}
|
|
67
|
+
<span class="badge bg-warning ms-2">not found</span>
|
|
68
|
+
{% endif %}
|
|
69
|
+
</button>
|
|
70
|
+
</h2>
|
|
71
|
+
<div id="navAcc-{{ nf_id }}" class="accordion-collapse collapse {% if forloop.first %}show{% endif %}"
|
|
72
|
+
data-bs-parent="#navAccordion">
|
|
73
|
+
<div class="accordion-body p-0">
|
|
74
|
+
{% if items %}
|
|
75
|
+
<ul class="list-group list-group-flush">
|
|
76
|
+
{% for item in items %}
|
|
77
|
+
<li class="list-group-item">
|
|
78
|
+
<div class="d-flex align-items-center">
|
|
79
|
+
{% if item.icon %}<i class="{{ item.icon }} me-2 text-primary"></i>{% endif %}
|
|
80
|
+
<div>
|
|
81
|
+
<strong>{{ item.title }}</strong>
|
|
82
|
+
{% if item.url %}<code class="ms-2 small">{{ item.url }}</code>{% endif %}
|
|
83
|
+
</div>
|
|
84
|
+
{% if item.external %}<span class="badge bg-info ms-auto">external</span>{% endif %}
|
|
85
|
+
</div>
|
|
86
|
+
{% if item.children %}
|
|
87
|
+
<small class="text-body-secondary ms-4">{{ item.children | size }} sub-items</small>
|
|
88
|
+
{% endif %}
|
|
89
|
+
</li>
|
|
90
|
+
{% endfor %}
|
|
91
|
+
</ul>
|
|
92
|
+
{% else %}
|
|
93
|
+
<div class="p-3 text-body-secondary small">No data file found for <code>{{ nf }}.yml</code></div>
|
|
94
|
+
{% endif %}
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
{% endfor %}
|
|
99
|
+
</div>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
===================================================================
|
|
3
|
+
SETUP BANNER - Persistent notification for unconfigured sites
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: setup-banner.html
|
|
7
|
+
Path: _includes/components/setup-banner.html
|
|
8
|
+
Purpose: Shows a dismissible top-bar when the site still needs
|
|
9
|
+
configuration. Disappears once site_configured is true.
|
|
10
|
+
|
|
11
|
+
Usage (add to root.html or any layout):
|
|
12
|
+
include components/setup-banner.html
|
|
13
|
+
|
|
14
|
+
Dependencies: components/setup-check.html (auto-included)
|
|
15
|
+
===================================================================
|
|
16
|
+
{% endcomment %}
|
|
17
|
+
|
|
18
|
+
{% include components/setup-check.html %}
|
|
19
|
+
|
|
20
|
+
{% if site_needs_setup %}
|
|
21
|
+
<div class="alert alert-primary alert-dismissible fade show rounded-0 mb-0 py-2 text-center" role="alert" id="setup-banner">
|
|
22
|
+
<i class="bi bi-gear-wide-connected me-1"></i>
|
|
23
|
+
<strong>Almost there!</strong>
|
|
24
|
+
Your site is running with default settings.
|
|
25
|
+
<a href="{{ '/404.html' | relative_url }}" class="alert-link">Complete setup →</a>
|
|
26
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
27
|
+
</div>
|
|
28
|
+
{% endif %}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
===================================================================
|
|
3
|
+
SETUP CHECK - Detect unconfigured site state
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: setup-check.html
|
|
7
|
+
Path: _includes/components/setup-check.html
|
|
8
|
+
Purpose: Provides Liquid variables to detect whether the site has been
|
|
9
|
+
configured by the user or is still running on theme defaults.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
{% include components/setup-check.html %}
|
|
13
|
+
{% if site_needs_setup %}
|
|
14
|
+
... show setup guidance ...
|
|
15
|
+
{% endif %}
|
|
16
|
+
|
|
17
|
+
Detection Logic:
|
|
18
|
+
The include sets site_needs_setup to true when the site appears
|
|
19
|
+
to be running with default/unconfigured values. It checks:
|
|
20
|
+
1. Explicit site_configured: true flag (fastest path)
|
|
21
|
+
2. Whether the title is still the theme default
|
|
22
|
+
3. Whether founder/name are still theme defaults
|
|
23
|
+
|
|
24
|
+
Output Variables:
|
|
25
|
+
- site_needs_setup : true if the site hasn't been personalised
|
|
26
|
+
- site_is_user_repo : true if this appears to be a <user>.github.io repo
|
|
27
|
+
===================================================================
|
|
28
|
+
{% endcomment %}
|
|
29
|
+
|
|
30
|
+
{% comment %}
|
|
31
|
+
── Determine if this is a user/org site (username.github.io) ──
|
|
32
|
+
User sites have an empty baseurl and a url ending in .github.io
|
|
33
|
+
{% endcomment %}
|
|
34
|
+
{% assign site_is_user_repo = false %}
|
|
35
|
+
{% if site.baseurl == "" or site.baseurl == nil %}
|
|
36
|
+
{% if site.url contains ".github.io" %}
|
|
37
|
+
{% assign _url_path = site.url | split: "/" | last %}
|
|
38
|
+
{% unless _url_path contains "/" %}
|
|
39
|
+
{% assign site_is_user_repo = true %}
|
|
40
|
+
{% endunless %}
|
|
41
|
+
{% endif %}
|
|
42
|
+
{% endif %}
|
|
43
|
+
|
|
44
|
+
{% comment %}
|
|
45
|
+
── Check if the site has been configured ──
|
|
46
|
+
Priority 1: Explicit flag in _config.yml
|
|
47
|
+
Priority 2: Heuristic — title/founder still match theme defaults
|
|
48
|
+
{% endcomment %}
|
|
49
|
+
{% assign site_needs_setup = false %}
|
|
50
|
+
|
|
51
|
+
{% if site.site_configured == false %}
|
|
52
|
+
{% assign site_needs_setup = true %}
|
|
53
|
+
{% endif %}
|