jekyll-theme-zer0 1.19.1 → 1.20.2
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 +395 -0
- data/README.md +27 -19
- data/_data/authors.yml +154 -5
- data/_data/backlog.yml +5 -5
- data/_data/content_statistics.yml +273 -297
- data/_data/features.yml +4 -25
- data/_data/navigation/README.md +24 -0
- data/_data/navigation/about.yml +2 -0
- data/_data/navigation/main.yml +2 -7
- data/_data/roadmap.yml +86 -12
- data/_includes/components/author-avatar-url.html +28 -0
- data/_includes/components/author-bio.html +86 -0
- data/_includes/components/author-card.html +184 -121
- data/_includes/components/author-eeat.html +10 -4
- data/_includes/components/info-section.html +1 -1
- data/_includes/components/mermaid.html +0 -3
- data/_includes/components/post-card.html +19 -9
- data/_includes/content/giscus.html +3 -2
- data/_includes/core/footer-fabs.html +28 -0
- data/_includes/core/footer.html +7 -17
- data/_includes/core/head.html +2 -2
- data/_includes/navigation/breadcrumbs.html +20 -2
- data/_includes/navigation/local-graph.html +18 -2
- data/_includes/obsidian/full-graph.html +4 -6
- data/_layouts/article.html +44 -74
- data/_layouts/author.html +274 -0
- data/_layouts/authors.html +55 -0
- data/_layouts/news.html +3 -3
- data/_layouts/note.html +21 -6
- data/_layouts/notebook.html +21 -6
- data/_layouts/root.html +31 -17
- data/_layouts/section.html +3 -3
- data/_plugins/author_pages_generator.rb +121 -0
- data/_sass/components/_author.scss +219 -0
- data/_sass/components/_content-tables.scss +16 -1
- data/_sass/components/_notes-index.scss +102 -0
- data/_sass/components/_search-modal.scss +40 -0
- data/_sass/components/_ui-enhancements.scss +570 -0
- data/_sass/core/_docs-code-examples.scss +463 -0
- data/_sass/core/_docs-layout.scss +0 -453
- data/_sass/core/_navbar.scss +253 -0
- data/_sass/core/_sidebar-extras.scss +79 -0
- data/_sass/core/_toc.scss +87 -0
- data/_sass/core/_variables.scss +7 -142
- data/_sass/custom.scss +24 -1122
- data/_sass/layouts/_global-chrome.scss +59 -0
- data/assets/css/main.scss +19 -2
- data/assets/js/author-profile.js +190 -0
- data/assets/js/modules/navigation/navbar.js +104 -0
- data/assets/js/obsidian-graph.js +2 -2
- data/assets/js/obsidian-local-graph.js +11 -5
- data/assets/vendor/cytoscape/cytoscape.min.js +32 -0
- data/scripts/README.md +39 -0
- data/scripts/bin/validate +11 -1
- data/scripts/dev/css-diff.sh +49 -0
- data/scripts/dev/shot.js +37 -0
- data/scripts/features/generate-preview-images +110 -6
- data/scripts/features/pixelate-preview-images +126 -0
- data/scripts/features/pixelate_images.py +662 -0
- data/scripts/github-setup.sh +0 -0
- data/scripts/lib/preview_generator.py +47 -3
- data/scripts/pixelate-preview-images.sh +12 -0
- data/scripts/test/integration/auto-version +10 -8
- data/scripts/test/lib/run_tests.sh +2 -0
- data/scripts/test/lib/test_content_review.sh +205 -0
- data/scripts/test/lib/test_pixelate_images.sh +108 -0
- metadata +25 -20
- data/_data/hub.yml +0 -68
- data/_data/hub_index.yml +0 -203
- data/_data/navigation/hub.yml +0 -110
- data/assets/vendor/font-awesome/css/all.min.css +0 -9
- data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
- data/assets/vendor/jquery/jquery-3.7.1.min.js +0 -2
- data/scripts/lib/hub.rb +0 -208
- data/scripts/provision-org-sites.rb +0 -252
- data/scripts/provision-org-sites.sh +0 -23
- data/scripts/sync-hub-metadata.rb +0 -184
- data/scripts/sync-hub-metadata.sh +0 -22
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
|
|
3
|
+
// UI/UX enhancements — Bootstrap component polish (buttons, cards, hero, etc.)
|
|
4
|
+
|
|
5
|
+
// ----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
// Extracted from custom.scss (Phase 5). Global element/loading styles plus the
|
|
8
|
+
|
|
9
|
+
// interaction/animation polish layered on top of Bootstrap components.
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
13
|
+
img {
|
|
14
|
+
display: inline-block;
|
|
15
|
+
max-width: 100%;
|
|
16
|
+
height: auto;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// MOVED → _sass/core/_navbar.scss — navbar-brand logo sizing + the #navbar
|
|
20
|
+
// fixed/auto-hide desktop grid + responsive/mobile navbar layout now live with
|
|
21
|
+
// the rest of the navbar styling.
|
|
22
|
+
|
|
23
|
+
// MOVED → _sass/components/_search-modal.scss (search modal + folder tree).
|
|
24
|
+
|
|
25
|
+
// ==============================================================================
|
|
26
|
+
// UI/UX ENHANCEMENTS - Modern, polished interactions
|
|
27
|
+
// ==============================================================================
|
|
28
|
+
|
|
29
|
+
// Hero Section Enhancements
|
|
30
|
+
// NOTE: Exclude .zer0-bg-hero so skin-specific gradients from _backgrounds.scss take precedence
|
|
31
|
+
.bg-primary:not(.zer0-bg-hero) {
|
|
32
|
+
position: relative;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
|
|
35
|
+
&::before {
|
|
36
|
+
content: '';
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: 0;
|
|
39
|
+
left: 0;
|
|
40
|
+
right: 0;
|
|
41
|
+
bottom: 0;
|
|
42
|
+
background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Hero content animations
|
|
48
|
+
.bg-primary .container-xl {
|
|
49
|
+
animation: fadeInUp 0.8s ease-out;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@keyframes fadeInUp {
|
|
53
|
+
from {
|
|
54
|
+
opacity: 0;
|
|
55
|
+
transform: translateY(30px);
|
|
56
|
+
}
|
|
57
|
+
to {
|
|
58
|
+
opacity: 1;
|
|
59
|
+
transform: translateY(0);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Enhanced Button Styles
|
|
64
|
+
.btn {
|
|
65
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
66
|
+
position: relative;
|
|
67
|
+
overflow: hidden;
|
|
68
|
+
|
|
69
|
+
&::before {
|
|
70
|
+
content: '';
|
|
71
|
+
position: absolute;
|
|
72
|
+
top: 50%;
|
|
73
|
+
left: 50%;
|
|
74
|
+
width: 0;
|
|
75
|
+
height: 0;
|
|
76
|
+
border-radius: 50%;
|
|
77
|
+
background: rgba(255, 255, 255, 0.2);
|
|
78
|
+
transform: translate(-50%, -50%);
|
|
79
|
+
transition: width 0.6s, height 0.6s;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&:hover::before {
|
|
83
|
+
width: 300px;
|
|
84
|
+
height: 300px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&:hover {
|
|
88
|
+
transform: translateY(-2px);
|
|
89
|
+
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
&:active {
|
|
93
|
+
transform: translateY(0);
|
|
94
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&.btn-lg {
|
|
98
|
+
padding: 0.75rem 1.5rem;
|
|
99
|
+
font-size: 1.125rem;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.btn-outline-light:hover {
|
|
104
|
+
background-color: rgba(255, 255, 255, 0.95);
|
|
105
|
+
color: var(--bs-primary);
|
|
106
|
+
border-color: rgba(255, 255, 255, 0.95);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.btn-light:hover {
|
|
110
|
+
background-color: rgba(255, 255, 255, 0.9);
|
|
111
|
+
transform: translateY(-2px);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Enhanced Card Styles
|
|
115
|
+
.card {
|
|
116
|
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
117
|
+
border: 1px solid rgba(0, 0, 0, 0.08);
|
|
118
|
+
|
|
119
|
+
&:hover {
|
|
120
|
+
transform: translateY(-8px);
|
|
121
|
+
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
|
|
122
|
+
border-color: rgba(var(--bs-primary-rgb), 0.2);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.card-header {
|
|
126
|
+
transition: all 0.3s ease;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&:hover .card-header {
|
|
130
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Feature Cards - Icon Animation
|
|
135
|
+
.card-body {
|
|
136
|
+
.rounded-circle {
|
|
137
|
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
i {
|
|
141
|
+
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.card:hover .rounded-circle {
|
|
146
|
+
transform: scale(1.1) rotate(5deg);
|
|
147
|
+
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.card:hover .rounded-circle i {
|
|
151
|
+
transform: scale(1.2);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Code Block Enhancements
|
|
155
|
+
pre {
|
|
156
|
+
position: relative;
|
|
157
|
+
transition: all 0.3s ease;
|
|
158
|
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
|
159
|
+
|
|
160
|
+
&:hover {
|
|
161
|
+
border-color: rgba(var(--bs-primary-rgb), 0.3);
|
|
162
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
code {
|
|
166
|
+
font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
|
|
167
|
+
font-size: 0.875rem;
|
|
168
|
+
line-height: 1.6;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Quick Links Bar Enhancements
|
|
173
|
+
.bg-dark {
|
|
174
|
+
.btn-outline-light {
|
|
175
|
+
transition: all 0.3s ease;
|
|
176
|
+
border-width: 2px;
|
|
177
|
+
|
|
178
|
+
&:hover {
|
|
179
|
+
background-color: rgba(255, 255, 255, 0.95);
|
|
180
|
+
color: var(--bs-dark);
|
|
181
|
+
transform: translateY(-2px);
|
|
182
|
+
box-shadow: 0 4px 8px rgba(255, 255, 255, 0.2);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Smooth Scroll Enhancement
|
|
188
|
+
html {
|
|
189
|
+
scroll-behavior: smooth;
|
|
190
|
+
scroll-padding-top: 80px; // Account for fixed navbar
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Section Spacing Improvements
|
|
194
|
+
// Ensure anchored elements clear the fixed navbar when scrolled to
|
|
195
|
+
section,
|
|
196
|
+
.py-5,
|
|
197
|
+
[id] {
|
|
198
|
+
scroll-margin-top: 80px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Landing Page Quick Links Animation
|
|
202
|
+
.bg-dark {
|
|
203
|
+
animation: slideDown 0.6s ease-out;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@keyframes slideDown {
|
|
207
|
+
from {
|
|
208
|
+
opacity: 0;
|
|
209
|
+
transform: translateY(-20px);
|
|
210
|
+
}
|
|
211
|
+
to {
|
|
212
|
+
opacity: 1;
|
|
213
|
+
transform: translateY(0);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Feature Section Cards Stagger Animation
|
|
218
|
+
.bg-body-tertiary .row.g-4 > * {
|
|
219
|
+
animation: fadeInUp 0.6s ease-out backwards;
|
|
220
|
+
|
|
221
|
+
&:nth-child(1) { animation-delay: 0.1s; }
|
|
222
|
+
&:nth-child(2) { animation-delay: 0.2s; }
|
|
223
|
+
&:nth-child(3) { animation-delay: 0.3s; }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Installation Cards Enhancement
|
|
227
|
+
#get-started .card {
|
|
228
|
+
border-top: 3px solid transparent;
|
|
229
|
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
230
|
+
|
|
231
|
+
&:hover {
|
|
232
|
+
border-top-color: var(--bs-primary);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
&.card-header.bg-primary ~ .card-body {
|
|
236
|
+
border-top-color: var(--bs-primary);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
&.card-header.bg-info ~ .card-body {
|
|
240
|
+
border-top-color: var(--bs-info);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
&.card-header.bg-secondary ~ .card-body {
|
|
244
|
+
border-top-color: var(--bs-secondary);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Mobile Responsiveness Improvements
|
|
249
|
+
@media (max-width: 768px) {
|
|
250
|
+
.bg-primary .display-4 {
|
|
251
|
+
font-size: 2rem;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.bg-primary .lead {
|
|
255
|
+
font-size: 1rem;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.btn-lg {
|
|
259
|
+
padding: 0.625rem 1.25rem;
|
|
260
|
+
font-size: 1rem;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.card {
|
|
264
|
+
margin-bottom: 1rem;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Reduce hover effects on mobile for better performance
|
|
268
|
+
.card:hover {
|
|
269
|
+
transform: translateY(-4px);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.btn:hover {
|
|
273
|
+
transform: none;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Loading State for Images
|
|
278
|
+
img {
|
|
279
|
+
transition: opacity 0.3s ease;
|
|
280
|
+
|
|
281
|
+
&[loading="lazy"] {
|
|
282
|
+
opacity: 0;
|
|
283
|
+
|
|
284
|
+
&.loaded {
|
|
285
|
+
opacity: 1;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Focus States for Accessibility
|
|
291
|
+
.btn:focus-visible,
|
|
292
|
+
.card:focus-visible,
|
|
293
|
+
a:focus-visible {
|
|
294
|
+
outline: 3px solid rgba(var(--bs-primary-rgb), 0.5);
|
|
295
|
+
outline-offset: 2px;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Reduce Motion: the global `*,*::before,*::after` reduced-motion reset lives in
|
|
299
|
+
// _sass/utilities/_motion.scss (imported earlier, identical `!important` body).
|
|
300
|
+
// This duplicate was removed — no compiled change. The navbar-scoped
|
|
301
|
+
// `#navbar { transition: none }` reduced-motion rule above is kept (it targets a
|
|
302
|
+
// specific element, not the universal reset).
|
|
303
|
+
|
|
304
|
+
// Table Enhancements
|
|
305
|
+
.table {
|
|
306
|
+
transition: all 0.3s ease;
|
|
307
|
+
|
|
308
|
+
tbody tr {
|
|
309
|
+
transition: background-color 0.2s ease;
|
|
310
|
+
|
|
311
|
+
&:hover {
|
|
312
|
+
background-color: rgba(var(--bs-primary-rgb), 0.05);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Badge Enhancements
|
|
318
|
+
.badge {
|
|
319
|
+
transition: all 0.3s ease;
|
|
320
|
+
|
|
321
|
+
&:hover {
|
|
322
|
+
transform: scale(1.05);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Feature category badges on /features/
|
|
327
|
+
.feature-categories {
|
|
328
|
+
.badge {
|
|
329
|
+
&:hover,
|
|
330
|
+
&:focus-visible {
|
|
331
|
+
color: var(--bs-badge-color, #fff);
|
|
332
|
+
text-decoration: none;
|
|
333
|
+
filter: brightness(1.12);
|
|
334
|
+
transform: scale(1.05);
|
|
335
|
+
outline: 2px solid rgba(var(--bs-primary-rgb), 0.55);
|
|
336
|
+
outline-offset: 2px;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Link Enhancements
|
|
342
|
+
a:not(.btn) {
|
|
343
|
+
transition: color 0.2s ease;
|
|
344
|
+
text-decoration: none;
|
|
345
|
+
|
|
346
|
+
&:hover {
|
|
347
|
+
text-decoration: underline;
|
|
348
|
+
text-underline-offset: 3px;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Container Enhancements
|
|
353
|
+
.container-xl {
|
|
354
|
+
position: relative;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Hero Image Animation
|
|
358
|
+
.bg-primary img {
|
|
359
|
+
animation: fadeInRight 1s ease-out 0.3s backwards;
|
|
360
|
+
filter: drop-shadow(0 10px 30px rgba(0, 0, 0, 0.3));
|
|
361
|
+
transition: transform 0.3s ease;
|
|
362
|
+
|
|
363
|
+
&:hover {
|
|
364
|
+
transform: scale(1.02);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
@keyframes fadeInRight {
|
|
369
|
+
from {
|
|
370
|
+
opacity: 0;
|
|
371
|
+
transform: translateX(30px);
|
|
372
|
+
}
|
|
373
|
+
to {
|
|
374
|
+
opacity: 1;
|
|
375
|
+
transform: translateX(0);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Improved Shadow Utilities
|
|
380
|
+
.shadow-sm {
|
|
381
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08) !important;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.shadow {
|
|
385
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.12) !important;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.shadow-lg {
|
|
389
|
+
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15) !important;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Button Ripple Effect — JS-injected `.ripple` click element.
|
|
393
|
+
// `position: relative` / `overflow: hidden` are already set on `.btn` by the
|
|
394
|
+
// "Enhanced Button Styles" block above; the duplicate declarations here were
|
|
395
|
+
// removed (no compiled change — they resolved to the same values).
|
|
396
|
+
.btn {
|
|
397
|
+
.ripple {
|
|
398
|
+
position: absolute;
|
|
399
|
+
border-radius: 50%;
|
|
400
|
+
background: rgba(255, 255, 255, 0.6);
|
|
401
|
+
transform: scale(0);
|
|
402
|
+
animation: ripple-animation 0.6s ease-out;
|
|
403
|
+
pointer-events: none;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
@keyframes ripple-animation {
|
|
408
|
+
to {
|
|
409
|
+
transform: scale(4);
|
|
410
|
+
opacity: 0;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Mobile Navigation Enhancements
|
|
415
|
+
@media (max-width: 991.98px) {
|
|
416
|
+
.navbar-collapse {
|
|
417
|
+
background-color: var(--bs-body-bg);
|
|
418
|
+
border-radius: 0.5rem;
|
|
419
|
+
margin-top: 1rem;
|
|
420
|
+
padding: 1rem;
|
|
421
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.navbar-nav .nav-link {
|
|
425
|
+
padding: 0.75rem 1rem;
|
|
426
|
+
border-radius: 0.375rem;
|
|
427
|
+
transition: all 0.2s ease;
|
|
428
|
+
|
|
429
|
+
&:hover {
|
|
430
|
+
background-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Improved Mobile Hero Section
|
|
436
|
+
@media (max-width: 768px) {
|
|
437
|
+
.bg-primary {
|
|
438
|
+
padding: 2rem 0 !important;
|
|
439
|
+
|
|
440
|
+
.display-4 {
|
|
441
|
+
font-size: 1.75rem;
|
|
442
|
+
line-height: 1.3;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.lead {
|
|
446
|
+
font-size: 0.95rem;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.btn-lg {
|
|
450
|
+
width: 100%;
|
|
451
|
+
margin-bottom: 0.5rem;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Better card spacing on mobile
|
|
456
|
+
.row.g-4 > * {
|
|
457
|
+
margin-bottom: 1rem;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Improved code block readability on mobile
|
|
461
|
+
pre {
|
|
462
|
+
font-size: 0.8rem;
|
|
463
|
+
overflow-x: auto;
|
|
464
|
+
-webkit-overflow-scrolling: touch;
|
|
465
|
+
|
|
466
|
+
&:not(.highlight) {
|
|
467
|
+
padding: var(--zer0-space-2);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.highlight:not(pre) pre,
|
|
472
|
+
pre.highlight {
|
|
473
|
+
padding: 0;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// Touch-friendly tap targets
|
|
478
|
+
@media (hover: none) and (pointer: coarse) {
|
|
479
|
+
.btn,
|
|
480
|
+
.card,
|
|
481
|
+
a {
|
|
482
|
+
min-height: 44px; // iOS HIG recommendation
|
|
483
|
+
min-width: 44px;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Disable hover effects on touch devices
|
|
487
|
+
.card:hover {
|
|
488
|
+
transform: none;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.btn:hover {
|
|
492
|
+
transform: none;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Improved focus visibility for keyboard navigation
|
|
497
|
+
*:focus-visible {
|
|
498
|
+
outline: 2px solid var(--bs-primary);
|
|
499
|
+
outline-offset: 2px;
|
|
500
|
+
border-radius: 0.25rem;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Enhanced active link states
|
|
504
|
+
.nav-link.active,
|
|
505
|
+
.btn.active {
|
|
506
|
+
position: relative;
|
|
507
|
+
|
|
508
|
+
&::after {
|
|
509
|
+
content: '';
|
|
510
|
+
position: absolute;
|
|
511
|
+
bottom: 0;
|
|
512
|
+
left: 50%;
|
|
513
|
+
transform: translateX(-50%);
|
|
514
|
+
width: 80%;
|
|
515
|
+
height: 2px;
|
|
516
|
+
background-color: currentColor;
|
|
517
|
+
border-radius: 2px;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Better table responsiveness
|
|
522
|
+
@media (max-width: 768px) {
|
|
523
|
+
.table-responsive {
|
|
524
|
+
border-radius: 0.5rem;
|
|
525
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
.table {
|
|
529
|
+
font-size: 0.875rem;
|
|
530
|
+
|
|
531
|
+
th, td {
|
|
532
|
+
padding: 0.5rem;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Improved badge styling
|
|
538
|
+
.badge {
|
|
539
|
+
font-weight: 500;
|
|
540
|
+
letter-spacing: 0.025em;
|
|
541
|
+
padding: 0.35em 0.65em;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Enhanced form controls
|
|
545
|
+
.form-control:focus,
|
|
546
|
+
.form-select:focus {
|
|
547
|
+
border-color: var(--bs-primary);
|
|
548
|
+
box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
|
|
549
|
+
transform: translateY(-1px);
|
|
550
|
+
transition: all 0.2s ease;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// MOVED → _sass/components/_skeleton.scss (token-aware, dark-mode-safe)
|
|
554
|
+
|
|
555
|
+
// Print optimizations
|
|
556
|
+
@media print {
|
|
557
|
+
.btn,
|
|
558
|
+
.card:hover,
|
|
559
|
+
.navbar,
|
|
560
|
+
.footer {
|
|
561
|
+
box-shadow: none !important;
|
|
562
|
+
transform: none !important;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
a[href^="#"]::after {
|
|
566
|
+
content: " (" attr(href) ")";
|
|
567
|
+
font-size: 0.8em;
|
|
568
|
+
color: #666;
|
|
569
|
+
}
|
|
570
|
+
}
|