jekyll-theme-zer0 0.22.5 → 0.22.20

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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +196 -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/cookie-consent.html +35 -100
  15. data/_includes/components/env-dashboard.html +154 -0
  16. data/_includes/components/feature-card.html +94 -0
  17. data/_includes/components/info-section.html +172 -149
  18. data/_includes/components/js-cdn.html +4 -1
  19. data/_includes/components/nanobar.html +117 -0
  20. data/_includes/components/nav-editor.html +99 -0
  21. data/_includes/components/setup-banner.html +28 -0
  22. data/_includes/components/setup-check.html +53 -0
  23. data/_includes/components/svg-background.html +42 -0
  24. data/_includes/components/theme-customizer.html +46 -0
  25. data/_includes/content/seo.html +68 -135
  26. data/_includes/core/footer.html +10 -12
  27. data/_includes/core/head.html +7 -27
  28. data/_includes/core/header.html +30 -17
  29. data/_includes/landing/landing-install-cards.html +18 -7
  30. data/_includes/navigation/admin-nav.html +95 -0
  31. data/_includes/navigation/navbar.html +45 -6
  32. data/_includes/navigation/sidebar-left.html +1 -1
  33. data/_includes/setup/wizard.html +330 -0
  34. data/_layouts/admin.html +166 -0
  35. data/_layouts/landing.html +15 -9
  36. data/_layouts/root.html +12 -6
  37. data/_layouts/setup.html +73 -0
  38. data/_plugins/preview_image_generator.rb +26 -12
  39. data/_sass/core/_navbar.scss +8 -2
  40. data/_sass/custom.scss +65 -10
  41. data/_sass/theme/_background-mixins.scss +95 -0
  42. data/_sass/theme/_backgrounds.scss +156 -0
  43. data/_sass/theme/_color-modes.scss +2 -1
  44. data/assets/backgrounds/gradients/air.svg +15 -0
  45. data/assets/backgrounds/gradients/aqua.svg +15 -0
  46. data/assets/backgrounds/gradients/contrast.svg +15 -0
  47. data/assets/backgrounds/gradients/dark.svg +15 -0
  48. data/assets/backgrounds/gradients/dirt.svg +15 -0
  49. data/assets/backgrounds/gradients/mint.svg +15 -0
  50. data/assets/backgrounds/gradients/neon.svg +15 -0
  51. data/assets/backgrounds/gradients/plum.svg +15 -0
  52. data/assets/backgrounds/gradients/sunrise.svg +15 -0
  53. data/assets/backgrounds/noise/air.svg +8 -0
  54. data/assets/backgrounds/noise/aqua.svg +8 -0
  55. data/assets/backgrounds/noise/contrast.svg +8 -0
  56. data/assets/backgrounds/noise/dark.svg +8 -0
  57. data/assets/backgrounds/noise/dirt.svg +8 -0
  58. data/assets/backgrounds/noise/mint.svg +8 -0
  59. data/assets/backgrounds/noise/neon.svg +8 -0
  60. data/assets/backgrounds/noise/plum.svg +8 -0
  61. data/assets/backgrounds/noise/sunrise.svg +8 -0
  62. data/assets/backgrounds/patterns/air.svg +7 -0
  63. data/assets/backgrounds/patterns/aqua.svg +7 -0
  64. data/assets/backgrounds/patterns/contrast.svg +4 -0
  65. data/assets/backgrounds/patterns/dark.svg +5 -0
  66. data/assets/backgrounds/patterns/dirt.svg +5 -0
  67. data/assets/backgrounds/patterns/mint.svg +6 -0
  68. data/assets/backgrounds/patterns/neon.svg +6 -0
  69. data/assets/backgrounds/patterns/plum.svg +6 -0
  70. data/assets/backgrounds/patterns/sunrise.svg +5 -0
  71. data/assets/js/background-customizer.js +73 -0
  72. data/assets/js/code-copy.js +18 -47
  73. data/assets/js/config-utility.js +307 -0
  74. data/assets/js/nanobar-init.js +63 -0
  75. data/assets/js/nav-editor.js +39 -0
  76. data/assets/js/palette-generator.js +415 -0
  77. data/assets/js/search-modal.js +31 -11
  78. data/assets/js/setup-wizard.js +306 -0
  79. data/assets/js/skin-editor.js +645 -0
  80. data/assets/js/theme-customizer.js +102 -0
  81. data/assets/js/ui-enhancements.js +2 -24
  82. data/assets/vendor/bootstrap/css/bootstrap.min.css +1 -0
  83. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +1 -0
  84. data/scripts/README.md +45 -0
  85. data/scripts/features/generate-preview-images +297 -7
  86. data/scripts/features/install-preview-generator +51 -33
  87. data/scripts/fork-cleanup.sh +92 -19
  88. data/scripts/github-setup.sh +284 -0
  89. data/scripts/init_setup.sh +0 -1
  90. data/scripts/lib/frontmatter.sh +543 -0
  91. data/scripts/lib/migrate.sh +265 -0
  92. data/scripts/lib/preview_generator.py +607 -32
  93. data/scripts/lint-pages +508 -0
  94. data/scripts/migrate.sh +201 -0
  95. data/scripts/platform/setup-linux.sh +244 -0
  96. data/scripts/platform/setup-macos.sh +187 -0
  97. data/scripts/platform/setup-wsl.sh +196 -0
  98. metadata +73 -6
@@ -0,0 +1,154 @@
1
+ <!--
2
+ ===================================================================
3
+ ENV DASHBOARD — Full environment and build information
4
+ ===================================================================
5
+
6
+ File: env-dashboard.html
7
+ Path: _includes/components/env-dashboard.html
8
+ Purpose: Consolidates environment, build, theme, and plugin info
9
+ into a full admin page. Extends the data shown in the
10
+ gear modal's Environment tab.
11
+
12
+ Dependencies: Bootstrap 5 card/table, Jekyll variables
13
+ Used by: pages/_about/settings/environment.md
14
+ ===================================================================
15
+ -->
16
+
17
+ <!-- Environment Overview Cards -->
18
+ <div class="row g-3 mb-4">
19
+ <div class="col-6 col-lg-3">
20
+ <div class="card text-center h-100 border-primary">
21
+ <div class="card-body py-3">
22
+ <i class="bi bi-diamond fs-3 text-primary"></i>
23
+ <div class="fw-semibold mt-1">Jekyll {{ jekyll.version | default: "?" }}</div>
24
+ <small class="text-body-secondary">Jekyll Version</small>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ <div class="col-6 col-lg-3">
29
+ <div class="card text-center h-100 border-primary">
30
+ <div class="card-body py-3">
31
+ <i class="bi bi-gem fs-3 text-primary"></i>
32
+ <div class="fw-semibold mt-1">{{ site.ruby_version | default: "?" }}</div>
33
+ <small class="text-body-secondary">Ruby Version</small>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <div class="col-6 col-lg-3">
38
+ <div class="card text-center h-100 {% if jekyll.environment == 'production' %}border-success{% else %}border-warning{% endif %}">
39
+ <div class="card-body py-3">
40
+ <i class="bi bi-lightning-charge fs-3 {% if jekyll.environment == 'production' %}text-success{% else %}text-warning{% endif %}"></i>
41
+ <div class="fw-semibold mt-1 text-capitalize">{{ jekyll.environment }}</div>
42
+ <small class="text-body-secondary">Environment</small>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ <div class="col-6 col-lg-3">
47
+ <div class="card text-center h-100 border-primary">
48
+ <div class="card-body py-3">
49
+ <i class="bi bi-clock-history fs-3 text-primary"></i>
50
+ <div class="fw-semibold mt-1">{{ site.time | date: "%b %d, %Y" }}</div>
51
+ <small class="text-body-secondary">Build Time</small>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="row g-4">
58
+
59
+ <!-- Site Configuration -->
60
+ <div class="col-lg-6">
61
+ <div class="card h-100">
62
+ <div class="card-header"><i class="bi bi-globe me-1"></i> Site Configuration</div>
63
+ <div class="card-body p-0">
64
+ <table class="table table-sm mb-0">
65
+ <tbody>
66
+ <tr><td class="fw-semibold">Title</td><td>{{ site.title | escape }}</td></tr>
67
+ <tr><td class="fw-semibold">URL</td><td><code class="small">{{ site.url }}</code></td></tr>
68
+ <tr><td class="fw-semibold">Base URL</td><td><code class="small">{{ site.baseurl | default: "/" }}</code></td></tr>
69
+ <tr><td class="fw-semibold">Description</td><td class="small">{{ site.description | truncate: 80 | escape }}</td></tr>
70
+ <tr><td class="fw-semibold">Locale</td><td>{{ site.locale | default: "en_US" }}</td></tr>
71
+ <tr><td class="fw-semibold">Markdown</td><td><code class="small">{{ site.markdown | default: "kramdown" }}</code></td></tr>
72
+ <tr><td class="fw-semibold">Theme Skin</td><td>{{ site.theme_skin | default: "dark" }}</td></tr>
73
+ </tbody>
74
+ </table>
75
+ </div>
76
+ </div>
77
+ </div>
78
+
79
+ <!-- Theme & Repository Info -->
80
+ <div class="col-lg-6">
81
+ <div class="card h-100">
82
+ <div class="card-header"><i class="bi bi-palette me-1"></i> Theme & Repository</div>
83
+ <div class="card-body p-0">
84
+ <table class="table table-sm mb-0">
85
+ <tbody>
86
+ <tr>
87
+ <td class="fw-semibold">Theme</td>
88
+ <td>{{ site.theme | default: "remote" }} {% if site.remote_theme %}<span class="badge bg-info">remote</span>{% endif %}</td>
89
+ </tr>
90
+ {% if site.remote_theme %}
91
+ <tr><td class="fw-semibold">Remote Theme</td><td><code class="small">{{ site.remote_theme }}</code></td></tr>
92
+ {% endif %}
93
+ <tr><td class="fw-semibold">GitHub User</td><td>{{ site.github_user | escape }}</td></tr>
94
+ <tr><td class="fw-semibold">Repository</td><td><code class="small">{{ site.repository_name }}</code></td></tr>
95
+ <tr><td class="fw-semibold">Local Repo</td><td><code class="small">{{ site.local_repo | default: "n/a" }}</code></td></tr>
96
+ <tr>
97
+ <td class="fw-semibold">Collections Dir</td>
98
+ <td><code class="small">{{ site.collections_dir | default: "." }}</code></td>
99
+ </tr>
100
+ <tr><td class="fw-semibold">Build Time</td><td><code class="small">{{ site.time | date: "%Y-%m-%d %H:%M:%S %Z" }}</code></td></tr>
101
+ </tbody>
102
+ </table>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ <!-- Plugins List -->
109
+ <h5 class="mt-4 mb-3"><i class="bi bi-plug me-1"></i> Active Plugins</h5>
110
+ {% if site.plugins %}
111
+ <div class="row g-2">
112
+ {% for plugin in site.plugins %}
113
+ <div class="col-6 col-md-4 col-lg-3">
114
+ <div class="card">
115
+ <div class="card-body py-2 px-3">
116
+ <i class="bi bi-puzzle me-1 text-primary"></i>
117
+ <span class="small fw-semibold">{{ plugin }}</span>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ {% endfor %}
122
+ </div>
123
+ {% else %}
124
+ <p class="text-body-secondary">No plugins configured.</p>
125
+ {% endif %}
126
+
127
+ <!-- URL Comparison (Dev vs Production) -->
128
+ <h5 class="mt-4 mb-3"><i class="bi bi-link-45deg me-1"></i> URL Configuration</h5>
129
+ <div class="table-responsive">
130
+ <table class="table table-sm">
131
+ <thead class="table-dark">
132
+ <tr>
133
+ <th>Setting</th>
134
+ <th>Current Value</th>
135
+ </tr>
136
+ </thead>
137
+ <tbody>
138
+ <tr><td class="fw-semibold">site.url</td><td><code>{{ site.url }}</code></td></tr>
139
+ <tr><td class="fw-semibold">site.baseurl</td><td><code>{{ site.baseurl | default: '""' }}</code></td></tr>
140
+ <tr><td class="fw-semibold">jekyll.environment</td><td><code>{{ jekyll.environment }}</code></td></tr>
141
+ <tr><td class="fw-semibold">Full base path</td><td><code>{{ site.url }}{{ site.baseurl }}</code></td></tr>
142
+ </tbody>
143
+ </table>
144
+ </div>
145
+
146
+ <!-- Quick links back to admin -->
147
+ <div class="mt-4">
148
+ <a href="{{ '/about/config/' | relative_url }}" class="btn btn-outline-secondary btn-sm me-2">
149
+ <i class="bi bi-gear me-1"></i> Full Configuration
150
+ </a>
151
+ <a href="{{ '/about/settings/analytics/' | relative_url }}" class="btn btn-outline-secondary btn-sm">
152
+ <i class="bi bi-graph-up me-1"></i> Analytics Dashboard
153
+ </a>
154
+ </div>
@@ -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 Modal with Tabbed Interface
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 modal with tabs for Settings, Environment, Developer
8
+ Purpose: Unified settings offcanvas panel with tabs for Settings, Environment, Developer
9
9
 
10
10
  Dependencies:
11
- - Bootstrap 5 Modal, Tabs
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/modal/
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 Modal -->
26
- <div class="modal fade" id="info-section" tabindex="-1" aria-labelledby="infoSectionLabel" aria-hidden="true">
27
- <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
28
- <div class="modal-content">
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
- <!-- Modal Header -->
31
- <div class="modal-header border-bottom-0 pb-0">
32
- <div class="w-100">
33
- <div class="d-flex align-items-center justify-content-between mb-2">
34
- <h5 class="modal-title" id="infoSectionLabel">
35
- <i class="bi bi-gear-wide-connected me-2"></i>Settings
36
- </h5>
37
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
38
- </div>
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
- </div>
68
-
69
- <!-- Modal Body with Tab Content -->
70
- <div class="modal-body">
71
- <div class="tab-content" id="infoTabContent">
72
-
73
- <!-- Settings Tab -->
74
- <div class="tab-pane fade show active" id="settings-pane" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">
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
- <!-- Environment Tab -->
111
- <div class="tab-pane fade" id="environment-pane" role="tabpanel" aria-labelledby="environment-tab" tabindex="0">
112
- {% include components/env-switcher.html %}
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
- <!-- Developer Tab -->
116
- <div class="tab-pane fade" id="developer-pane" role="tabpanel" aria-labelledby="developer-tab" tabindex="0">
117
-
118
- <!-- Page Location -->
119
- <div class="mb-4">
120
- <h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
121
- <i class="bi bi-signpost-split me-1"></i>Page Location
122
- </h6>
123
- {% include navigation/breadcrumbs.html %}
124
- </div>
125
-
126
- <!-- Source Code Shortcuts -->
127
- <div class="mb-4">
128
- <h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
129
- <i class="bi bi-code-square me-1"></i>Source Code
130
- </h6>
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
- <!-- Modal Footer -->
174
- <div class="modal-footer">
175
- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
176
- <i class="bi bi-x-lg me-1"></i>Close
177
- </button>
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 &amp; 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>