jekyll-theme-zer0 0.21.0 → 0.22.0

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +86 -46
  4. data/_data/authors.yml +12 -3
  5. data/_data/features.yml +1 -1
  6. data/_data/glossary.yml +101 -0
  7. data/_data/navigation/docs.yml +12 -0
  8. data/_data/navigation/home.yml +2 -2
  9. data/_data/navigation/main.yml +2 -8
  10. data/_data/prompts.yml +184 -0
  11. data/_includes/components/author-eeat.html +133 -0
  12. data/_includes/components/cookie-consent.html +9 -9
  13. data/_includes/components/dev-shortcuts.html +36 -27
  14. data/_includes/components/env-detect.html +14 -0
  15. data/_includes/components/env-switcher.html +38 -16
  16. data/_includes/components/halfmoon.html +31 -20
  17. data/_includes/components/info-section.html +4 -3
  18. data/_includes/components/js-cdn.html +8 -15
  19. data/_includes/components/mermaid.html +13 -9
  20. data/_includes/components/powered-by.html +5 -3
  21. data/_includes/content/intro.html +64 -4
  22. data/_includes/content/jsonld-faq.html +47 -0
  23. data/_includes/content/jsonld-software.html +121 -0
  24. data/_includes/content/sitemap.html +2 -2
  25. data/_includes/core/branding.html +9 -7
  26. data/_includes/core/footer.html +12 -9
  27. data/_includes/core/head.html +17 -14
  28. data/_includes/core/header.html +33 -21
  29. data/_includes/navigation/navbar.html +130 -124
  30. data/_includes/navigation/sidebar-left.html +3 -3
  31. data/_includes/navigation/sidebar-right.html +4 -8
  32. data/_includes/search-data.json +1 -2
  33. data/_layouts/landing.html +8 -3
  34. data/_layouts/root.html +4 -4
  35. data/_layouts/sitemap-collection.html +20 -10
  36. data/_sass/core/_docs-layout.scss +756 -0
  37. data/_sass/core/_navbar.scss +522 -69
  38. data/_sass/core/_offcanvas-panels.scss +48 -0
  39. data/_sass/core/_syntax.scss +1 -51
  40. data/_sass/core/_theme.scss +2 -249
  41. data/_sass/core/_variables.scss +1 -54
  42. data/_sass/core/code-copy.scss +6 -6
  43. data/_sass/custom.scss +119 -133
  44. data/_sass/theme/_color-modes.scss +3 -0
  45. data/_sass/theme/_css-variables.scss +29 -0
  46. data/_sass/theme/_wizard-mode.scss +31 -0
  47. data/assets/css/custom.css +5 -120
  48. data/assets/css/main.scss +6 -2
  49. data/assets/css/stats.css +3 -0
  50. data/assets/css/theme-npm-entry.scss +6 -0
  51. data/assets/css/vendor/.gitkeep +0 -0
  52. data/assets/images/authors/bamr87.png +0 -0
  53. data/assets/js/auto-hide-nav.js +71 -20
  54. data/assets/js/color-modes.js +8 -2
  55. data/assets/js/halfmoon.js +8 -2
  56. data/assets/js/myScript.js +4 -12
  57. data/assets/js/navigation.js +174 -19
  58. data/assets/js/search-modal.js +50 -7
  59. data/assets/vendor/bootstrap/css/bootstrap.min.css +5 -0
  60. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +6 -0
  61. data/assets/vendor/bootstrap-icons/font/bootstrap-icons.css +2018 -0
  62. data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
  63. data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
  64. data/assets/vendor/font-awesome/css/all.min.css +9 -0
  65. data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  66. data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  67. data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  68. data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  69. data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  70. data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  71. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  72. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  73. data/assets/vendor/github-calendar/github-calendar-responsive.css +231 -0
  74. data/assets/vendor/github-calendar/github-calendar.min.js +240 -0
  75. data/assets/vendor/jquery/jquery-3.7.1.min.js +2 -0
  76. data/assets/vendor/mathjax/es5/adaptors/liteDOM.js +1 -0
  77. data/assets/vendor/mathjax/es5/core.js +1 -0
  78. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff +0 -0
  79. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff +0 -0
  80. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff +0 -0
  81. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff +0 -0
  82. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff +0 -0
  83. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff +0 -0
  84. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff +0 -0
  85. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff +0 -0
  86. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff +0 -0
  87. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff +0 -0
  88. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff +0 -0
  89. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff +0 -0
  90. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff +0 -0
  91. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff +0 -0
  92. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff +0 -0
  93. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff +0 -0
  94. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff +0 -0
  95. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff +0 -0
  96. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff +0 -0
  97. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff +0 -0
  98. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff +0 -0
  99. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff +0 -0
  100. data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Zero.woff +0 -0
  101. data/assets/vendor/mathjax/es5/startup.js +1 -0
  102. data/assets/vendor/mathjax/es5/tex-mml-chtml.js +1 -0
  103. data/assets/vendor/mermaid/mermaid.min.js +2029 -0
  104. data/scripts/bin/build +12 -2
  105. data/scripts/lib/common.sh +55 -0
  106. data/scripts/lib/gem.sh +7 -0
  107. data/scripts/lib/validation.sh +9 -1
  108. data/scripts/lib/version.sh +41 -0
  109. data/scripts/test/integration/mermaid +1 -1
  110. data/scripts/vendor-install.sh +196 -0
  111. metadata +62 -3
  112. data/_sass/core/_docs.scss +0 -3219
@@ -5,13 +5,13 @@
5
5
  // Extracted from navbar.html inline styles for better maintainability
6
6
  // Breakpoints:
7
7
  // - Desktop XL >= 1200px (full labels)
8
- // - Desktop LG 992px-1199px (icons only, labels hidden)
8
+ // - Desktop LG 992px-1199px (icons with tooltips, optimized spacing)
9
9
  // - Mobile < 992px (offcanvas)
10
10
  // ==============================================================================
11
11
 
12
12
  // -----------------------------------------------------------------------------
13
13
  // Compact Desktop Navigation (992px - 1199px)
14
- // Hide labels, show icons only to prevent overflow
14
+ // Icons only with enhanced tooltips for better UX
15
15
  // -----------------------------------------------------------------------------
16
16
 
17
17
  @media (min-width: 992px) and (max-width: 1199.98px) {
@@ -23,35 +23,62 @@
23
23
  // Adjust icon margin when text is hidden
24
24
  #bdNavbar .nav-link i {
25
25
  margin-right: 0 !important;
26
+ font-size: 1.15rem; // Slightly larger icons for better visibility
26
27
  }
27
28
 
28
- // Compact nav item spacing
29
+ // Optimized nav item spacing for compact view
29
30
  #bdNavbar .navbar-nav {
30
- gap: 0;
31
+ gap: 0.125rem;
31
32
  }
32
33
 
33
34
  #bdNavbar .nav-link {
34
- padding: 0.5rem 0.5rem;
35
+ padding: 0.625rem 0.75rem; // Increased padding for better touch/click targets
36
+ min-width: 44px; // WCAG minimum touch target
37
+ min-height: 44px;
38
+ display: inline-flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ border-radius: 0.375rem; // Rounded corners for modern look
42
+ transition: all 0.2s ease-in-out;
43
+ }
44
+
45
+ // Beat later desktop rules that set display:flex without centering (icon-only rows)
46
+ #bdNavbar .nav-item > .nav-link:not(.btn),
47
+ #bdNavbar .nav-hover-dropdown > .nav-link:first-child {
48
+ justify-content: center;
35
49
  }
36
50
 
37
- // Dropdown toggle needs less space
51
+ // Enhanced hover state for better feedback
52
+ #bdNavbar .nav-link:hover {
53
+ background-color: var(--bs-tertiary-bg);
54
+ transform: translateY(-1px);
55
+ }
56
+
57
+ // Dropdown toggle with improved spacing
38
58
  .nav-hover-dropdown .dropdown-toggle-split {
39
- padding-left: 0;
40
- padding-right: 0.25rem;
59
+ padding: 0.625rem 0.5rem;
60
+ min-width: 32px; // Smaller but still accessible
41
61
 
42
62
  &::after {
43
- font-size: 0.65em;
63
+ font-size: 0.75em;
44
64
  margin-left: 0;
65
+ transition: transform 0.2s ease-in-out;
66
+ }
67
+
68
+ &:hover::after {
69
+ transform: translateY(2px); // Visual feedback on hover
45
70
  }
46
71
  }
47
72
 
48
- // Keep Search button label hidden
73
+ // Keep Search button label hidden with improved styling
49
74
  .nav-search-button .d-lg-inline {
50
75
  display: none !important;
51
76
  }
52
77
 
53
78
  .nav-search-button {
54
- padding: 0.5rem 0.5rem !important;
79
+ padding: 0.625rem 0.75rem !important;
80
+ min-width: 44px;
81
+ min-height: 44px;
55
82
  }
56
83
 
57
84
  // Hide site subtitle at compact breakpoint
@@ -59,39 +86,74 @@
59
86
  display: none !important;
60
87
  }
61
88
 
62
- // Reduce brand group spacing
89
+ // Optimize brand group spacing
63
90
  .navbar-brand-group {
64
91
  gap: 0.5rem !important;
65
92
  }
66
93
 
67
- // Compact home links
94
+ // Compact home links with better visual feedback
68
95
  .navbar-home-links .btn {
69
- padding: 0.375rem 0.5rem;
96
+ padding: 0.5rem 0.625rem;
97
+ min-width: 44px;
98
+ min-height: 44px;
99
+ border-radius: 0.375rem;
100
+ transition: all 0.2s ease-in-out;
101
+
102
+ &:hover {
103
+ background-color: var(--bs-tertiary-bg);
104
+ transform: translateY(-1px);
105
+ }
70
106
  }
71
107
  }
72
108
 
73
109
  // -----------------------------------------------------------------------------
74
110
  // Full Desktop Navigation (>= 1200px)
75
- // Show full labels with icons
111
+ // Show full labels with icons and enhanced interactions
76
112
  // -----------------------------------------------------------------------------
77
113
 
78
114
  @media (min-width: 1200px) {
115
+ // Flex + gap on parent (>=992) handles spacing; inline would block ellipsis shrinking
79
116
  #bdNavbar .nav-link .nav-link-text {
80
- display: inline;
81
- margin-left: 0.5rem;
117
+ margin-left: 0;
118
+ min-width: 0;
119
+ transition: opacity 0.15s ease-in-out;
82
120
  }
83
121
 
84
122
  #bdNavbar .nav-link i {
85
123
  margin-right: 0;
124
+ font-size: 1rem;
125
+ transition: transform 0.15s ease-in-out;
126
+ }
127
+
128
+ // Smooth hover animation
129
+ #bdNavbar .nav-link:hover {
130
+ background-color: var(--bs-tertiary-bg);
131
+ border-radius: 0.375rem;
132
+
133
+ i {
134
+ transform: scale(1.1);
135
+ }
136
+ }
137
+
138
+ // Enhanced dropdown parent link
139
+ .nav-hover-dropdown > .nav-link {
140
+ border-top-right-radius: 0;
141
+ border-bottom-right-radius: 0;
142
+ }
143
+
144
+ .nav-hover-dropdown > .dropdown-toggle-split {
145
+ border-top-left-radius: 0;
146
+ border-bottom-left-radius: 0;
86
147
  }
87
148
  }
88
149
 
89
150
  // -----------------------------------------------------------------------------
90
151
  // Utility Controls (Search, Settings)
152
+ // Enhanced for better accessibility and visual feedback
91
153
  // -----------------------------------------------------------------------------
92
154
 
93
155
  .navbar-utility-controls {
94
- gap: 0.25rem;
156
+ gap: 0.375rem;
95
157
  margin-left: auto;
96
158
 
97
159
  .nav-search-button,
@@ -99,30 +161,50 @@
99
161
  display: inline-flex;
100
162
  align-items: center;
101
163
  justify-content: center;
102
- padding: 0.5rem 0.75rem;
164
+ padding: 0.625rem 0.875rem;
165
+ min-width: 44px; // WCAG minimum
166
+ min-height: 44px;
103
167
  border: none;
168
+ border-radius: 0.375rem;
104
169
  background: transparent;
105
170
  color: var(--bs-body-color);
106
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out;
171
+ transition: all 0.2s ease-in-out;
107
172
 
108
173
  &:hover {
109
174
  color: var(--bs-primary);
110
175
  background-color: var(--bs-tertiary-bg);
176
+ transform: translateY(-1px);
177
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
178
+ }
179
+
180
+ &:active {
181
+ transform: translateY(0);
182
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
183
+ }
184
+
185
+ &:focus-visible {
186
+ outline: 2px solid var(--bs-primary);
187
+ outline-offset: 2px;
111
188
  }
112
189
 
113
190
  i {
114
- font-size: 1.1rem;
191
+ font-size: 1.15rem;
192
+ transition: transform 0.15s ease-in-out;
193
+ }
194
+
195
+ &:hover i {
196
+ transform: scale(1.1);
115
197
  }
116
198
  }
117
199
  }
118
200
 
119
201
  @media (min-width: 992px) and (max-width: 1199.98px) {
120
202
  .navbar-utility-controls {
121
- gap: 0;
203
+ gap: 0.25rem;
122
204
 
123
205
  .nav-search-button,
124
206
  .nav-settings-button {
125
- padding: 0.5rem;
207
+ padding: 0.625rem;
126
208
  }
127
209
 
128
210
  .nav-link-text {
@@ -133,12 +215,12 @@
133
215
 
134
216
  @media (max-width: 991.98px) {
135
217
  .navbar-utility-controls {
136
- gap: 0;
218
+ gap: 0.25rem;
137
219
 
138
220
  .nav-search-button {
139
- padding: 0.5rem;
140
- width: 2.5rem;
141
- height: 2.5rem;
221
+ padding: 0.625rem;
222
+ width: 48px; // Increased from 2.5rem for better touch
223
+ height: 48px;
142
224
  }
143
225
 
144
226
  .nav-link-text {
@@ -149,18 +231,21 @@
149
231
 
150
232
  // -----------------------------------------------------------------------------
151
233
  // Desktop Navigation (>= 992px) - Common styles
234
+ // Enhanced dropdown interactions and positioning
152
235
  // -----------------------------------------------------------------------------
153
236
 
154
237
  @media (min-width: 992px) {
155
- // Convert offcanvas to inline navigation on desktop
238
+ // Convert offcanvas to inline navigation on desktop (width bounded by parent grid column in custom.scss)
156
239
  #bdNavbar {
157
240
  position: static !important;
158
241
  transform: none !important;
159
242
  visibility: visible !important;
160
243
  background: transparent !important;
161
244
  border: none !important;
162
- width: auto !important;
163
- flex-grow: 0 !important;
245
+ width: 100% !important;
246
+ max-width: 100% !important;
247
+ min-width: 0 !important;
248
+ z-index: 1;
164
249
  }
165
250
 
166
251
  #bdNavbar .offcanvas-header {
@@ -169,37 +254,128 @@
169
254
 
170
255
  #bdNavbar .offcanvas-body {
171
256
  padding: 0 !important;
172
- overflow: visible !important;
257
+ min-width: 0;
258
+ width: 100%;
259
+ max-width: 100%;
260
+ overflow: visible;
173
261
  }
174
-
262
+
263
+ // Clip in-flow nav row without creating a scroll container (hidden + abs dropdowns = horiz scrollbar)
264
+ #bdNavbar .bd-navbar-nav-viewport {
265
+ width: 100%;
266
+ max-width: 100%;
267
+ min-width: 0;
268
+ overflow-y: visible;
269
+ container-type: inline-size;
270
+ container-name: bd-nav;
271
+ }
272
+
273
+ @supports (overflow-x: clip) {
274
+ #bdNavbar .bd-navbar-nav-viewport {
275
+ overflow-x: clip;
276
+ }
277
+ }
278
+
279
+ @supports not (overflow-x: clip) {
280
+ #bdNavbar .bd-navbar-nav-viewport {
281
+ overflow-x: hidden;
282
+ }
283
+ }
284
+
285
+ // Fill the track; items shrink — text truncates instead of scrolling
175
286
  #bdNavbar .navbar-nav {
176
287
  flex-direction: row !important;
177
- gap: 0.25rem;
288
+ flex-wrap: nowrap !important;
289
+ gap: 0.375rem;
290
+ width: 100%;
291
+ max-width: 100%;
292
+ min-width: 0;
293
+ margin-inline: 0;
294
+ justify-content: center;
295
+ justify-content: safe center;
178
296
  }
179
-
180
- // Dropdown positioning
297
+
298
+ #bdNavbar .nav-item {
299
+ position: relative;
300
+ min-width: 0;
301
+ flex: 0 1 auto;
302
+ }
303
+
181
304
  .nav-hover-dropdown {
182
305
  position: relative;
306
+ flex-wrap: nowrap !important;
307
+ min-width: 0;
308
+ flex: 0 1 auto;
309
+ }
310
+
311
+ // Dropdown row: label flexes, split toggle stays fixed width
312
+ .nav-hover-dropdown > .nav-link:first-child {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 0.375rem;
316
+ min-width: 0;
317
+ flex: 1 1 auto;
318
+ overflow: hidden;
319
+ }
320
+
321
+ .nav-hover-dropdown > .dropdown-toggle-split {
322
+ flex-shrink: 0;
323
+ }
324
+
325
+ #bdNavbar .nav-item > .nav-link:not(.btn) {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 0.375rem;
329
+ min-width: 0;
330
+ max-width: 100%;
331
+ overflow: hidden;
332
+ }
333
+
334
+ #bdNavbar .nav-link .nav-link-text {
335
+ min-width: 0;
336
+ overflow: hidden;
337
+ text-overflow: ellipsis;
338
+ white-space: nowrap;
183
339
  }
340
+
341
+ #bdNavbar .nav-link i {
342
+ flex-shrink: 0;
343
+ }
344
+
345
+ #bdNavbar .nav-link {
346
+ border-radius: 0.375rem;
347
+ transition: all 0.2s ease-in-out;
348
+
349
+ &:focus-visible {
350
+ outline: 2px solid var(--bs-primary);
351
+ outline-offset: 2px;
352
+ box-shadow: 0 0 0 4px rgba(13, 110, 253, 0.1);
353
+ }
354
+ }
355
+
356
+ // Dropdown positioning with improved animation
184
357
 
185
358
  .nav-hover-dropdown > .dropdown-menu {
186
359
  position: absolute;
187
- top: 100% !important;
360
+ top: calc(100% + 0.25rem) !important; // Slightly more space
188
361
  left: 0;
189
- margin-top: 0.125rem !important;
190
- min-width: 12rem;
362
+ margin-top: 0 !important;
363
+ min-width: 14rem; // Increased from 12rem
364
+ max-width: min(22rem, 100dvw - 1.5rem);
191
365
  z-index: 1050;
366
+ border-radius: 0.5rem;
367
+ box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.175);
368
+ border: 1px solid var(--bs-border-color-translucent);
192
369
  }
193
370
 
194
- // Hover behavior
195
- .nav-hover-dropdown:hover > .dropdown-menu {
196
- display: block;
197
- }
198
-
371
+ // Smooth hover reveal animation
199
372
  .nav-hover-dropdown .dropdown-menu {
200
373
  opacity: 0;
201
374
  visibility: hidden;
202
- transition: opacity 0.15s ease-in-out, visibility 0.15s ease-in-out;
375
+ transform: translateY(-0.5rem);
376
+ transition: opacity 0.2s ease-in-out,
377
+ visibility 0.2s ease-in-out,
378
+ transform 0.2s ease-in-out;
203
379
  display: block !important;
204
380
  }
205
381
 
@@ -207,24 +383,85 @@
207
383
  .nav-hover-dropdown .dropdown-menu.show {
208
384
  opacity: 1;
209
385
  visibility: visible;
386
+ transform: translateY(0);
210
387
  }
211
388
 
389
+ // Enhanced dropdown toggle
212
390
  .nav-hover-dropdown .dropdown-toggle-split {
213
- padding-left: 0.25rem;
214
- padding-right: 0.5rem;
391
+ padding-left: 0.375rem;
392
+ padding-right: 0.625rem;
393
+ border-radius: 0.375rem;
394
+ transition: all 0.2s ease-in-out;
395
+
396
+ &:hover {
397
+ background-color: var(--bs-tertiary-bg);
398
+ }
215
399
  }
216
400
 
217
401
  .nav-hover-dropdown .dropdown-toggle-split::after {
218
402
  vertical-align: 0.15em;
219
403
  font-size: 0.75em;
404
+ transition: transform 0.2s ease-in-out;
405
+ }
406
+
407
+ // Visual feedback when dropdown is open
408
+ .nav-hover-dropdown:hover .dropdown-toggle-split::after {
409
+ transform: rotate(180deg);
410
+ }
411
+
412
+ // After base dropdown-toggle rules so these win when the nav track is narrow
413
+ @container bd-nav (max-width: 42rem) {
414
+ #bdNavbar .nav-link .nav-link-text {
415
+ display: none !important;
416
+ }
417
+
418
+ #bdNavbar .nav-link i {
419
+ margin-right: 0 !important;
420
+ font-size: 1.15rem;
421
+ }
422
+
423
+ #bdNavbar .navbar-nav {
424
+ gap: 0.125rem;
425
+ }
426
+
427
+ #bdNavbar .nav-link {
428
+ padding: 0.625rem 0.75rem;
429
+ min-width: 44px;
430
+ min-height: 44px;
431
+ display: inline-flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ border-radius: 0.375rem;
435
+ }
436
+
437
+ .nav-hover-dropdown > .nav-link:first-child {
438
+ flex: 0 0 auto;
439
+ overflow: visible;
440
+ }
441
+
442
+ .nav-hover-dropdown .dropdown-toggle-split {
443
+ padding: 0.625rem 0.5rem;
444
+ min-width: 32px;
445
+
446
+ &::after {
447
+ font-size: 0.75em;
448
+ margin-left: 0;
449
+ }
450
+ }
220
451
  }
221
452
  }
222
453
 
223
454
  // -----------------------------------------------------------------------------
224
455
  // Mobile Navigation (< 992px)
456
+ // Enhanced for touch interactions and better UX
225
457
  // -----------------------------------------------------------------------------
226
458
 
227
459
  @media (max-width: 991.98px) {
460
+ // Wrapper is inert on mobile so offcanvas layout matches pre-wrapper structure
461
+ #bdNavbar .bd-navbar-nav-viewport {
462
+ display: contents;
463
+ }
464
+
228
465
  #bdNavbar .navbar-nav {
229
466
  flex-direction: column !important;
230
467
  }
@@ -235,27 +472,40 @@
235
472
  }
236
473
 
237
474
  .nav-hover-dropdown > .nav-link:first-child {
238
- flex: 0 0 auto !important;
475
+ flex: 1 1 auto !important; // Allow link to expand
239
476
  }
240
477
 
241
478
  .nav-hover-dropdown > .dropdown-toggle-split {
242
479
  flex: 0 0 auto;
243
- // Minimum touch target (44px WCAG recommendation)
244
- min-width: 44px;
245
- min-height: 44px;
480
+ // WCAG minimum touch target (48px recommended for mobile)
481
+ min-width: 48px;
482
+ min-height: 48px;
246
483
  display: flex;
247
484
  align-items: center;
248
485
  justify-content: center;
486
+ border-radius: 0.375rem;
487
+ transition: all 0.2s ease-in-out;
488
+
489
+ &:hover {
490
+ background-color: var(--bs-tertiary-bg);
491
+ }
492
+
493
+ &:focus-visible {
494
+ outline: 2px solid var(--bs-primary);
495
+ outline-offset: 2px;
496
+ }
249
497
  }
250
498
 
251
499
  .nav-hover-dropdown > .dropdown-toggle-split::after {
252
- transition: transform 0.25s ease;
500
+ transition: transform 0.3s ease-in-out;
253
501
  }
254
502
 
255
- .nav-hover-dropdown > .dropdown-toggle-split.show::after {
503
+ .nav-hover-dropdown > .dropdown-toggle-split.show::after,
504
+ .nav-hover-dropdown > .dropdown-toggle-split[aria-expanded="true"]::after {
256
505
  transform: rotate(180deg);
257
506
  }
258
507
 
508
+ // Improved dropdown menu animation
259
509
  .nav-hover-dropdown .dropdown-menu {
260
510
  position: static !important;
261
511
  float: none;
@@ -265,18 +515,20 @@
265
515
  border: none;
266
516
  box-shadow: none;
267
517
  background-color: var(--bs-tertiary-bg);
268
- padding-left: 1rem;
518
+ padding-left: 1.25rem; // Increased indent
269
519
  max-height: 0;
270
520
  overflow: hidden;
271
521
  opacity: 0;
272
- transition: max-height 0.3s ease, opacity 0.25s ease, padding 0.3s ease;
522
+ transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1),
523
+ opacity 0.3s ease-in-out,
524
+ padding 0.35s cubic-bezier(0.4, 0, 0.2, 1);
273
525
  padding-top: 0;
274
526
  padding-bottom: 0;
275
527
  display: block !important;
276
528
  }
277
529
 
278
530
  .nav-hover-dropdown .dropdown-menu.show {
279
- max-height: 500px;
531
+ max-height: 600px; // Increased for more items
280
532
  opacity: 1;
281
533
  padding-top: 0.5rem;
282
534
  padding-bottom: 0.5rem;
@@ -284,65 +536,193 @@
284
536
 
285
537
  // Larger touch targets for nav items
286
538
  #bdNavbar .nav-link {
539
+ padding: 0.875rem 1rem;
540
+ min-height: 52px; // Increased from 48px
541
+ display: flex;
542
+ align-items: center;
543
+ border-radius: 0.375rem;
544
+ transition: background-color 0.2s ease-in-out;
545
+
546
+ &:active {
547
+ background-color: var(--bs-tertiary-bg);
548
+ transform: scale(0.98);
549
+ }
550
+
551
+ &:focus-visible {
552
+ outline: 2px solid var(--bs-primary);
553
+ outline-offset: 2px;
554
+ }
555
+ }
556
+
557
+ // Dropdown items with better spacing
558
+ #bdNavbar .dropdown-item {
287
559
  padding: 0.75rem 1rem;
288
560
  min-height: 48px;
289
561
  display: flex;
290
562
  align-items: center;
563
+ border-radius: 0.375rem;
564
+ margin-bottom: 0.25rem;
565
+ transition: all 0.2s ease-in-out;
566
+
567
+ &:last-child {
568
+ margin-bottom: 0;
569
+ }
570
+
571
+ &:active {
572
+ transform: scale(0.98);
573
+ }
291
574
  }
292
575
 
293
- // Better close button
294
- #bdNavbar .offcanvas-header .btn-close {
295
- width: 44px;
296
- height: 44px;
297
- padding: 0;
576
+ // Better offcanvas header design
577
+ #bdNavbar .offcanvas-header {
578
+ border-bottom: 2px solid var(--bs-border-color);
579
+ padding: 1.25rem 1rem;
580
+
581
+ .offcanvas-title {
582
+ font-size: 1.125rem;
583
+ font-weight: 600;
584
+ color: var(--bs-emphasis-color);
585
+ }
586
+
587
+ .btn-close {
588
+ width: 48px;
589
+ height: 48px;
590
+ padding: 0;
591
+ border-radius: 0.375rem;
592
+ transition: all 0.2s ease-in-out;
593
+
594
+ &:hover {
595
+ background-color: var(--bs-tertiary-bg);
596
+ transform: rotate(90deg);
597
+ }
598
+
599
+ &:focus-visible {
600
+ outline: 2px solid var(--bs-primary);
601
+ outline-offset: 2px;
602
+ }
603
+ }
604
+ }
605
+
606
+ // Enhanced offcanvas body
607
+ #bdNavbar .offcanvas-body {
608
+ padding: 1rem;
298
609
  }
299
610
  }
300
611
 
301
612
  // -----------------------------------------------------------------------------
302
613
  // Active States
614
+ // Enhanced visual feedback for current page
303
615
  // -----------------------------------------------------------------------------
304
616
 
617
+ .nav-link[aria-current="page"] {
618
+ color: var(--bs-primary);
619
+ font-weight: 600;
620
+ position: relative;
621
+
622
+ &::after {
623
+ content: '';
624
+ position: absolute;
625
+ bottom: 0;
626
+ left: 50%;
627
+ transform: translateX(-50%);
628
+ width: 60%;
629
+ height: 2px;
630
+ background-color: var(--bs-primary);
631
+ border-radius: 2px;
632
+ }
633
+ }
634
+
305
635
  .dropdown-item[aria-current="page"] {
306
636
  background-color: var(--bs-primary);
307
637
  color: var(--bs-white);
638
+ font-weight: 500;
639
+ border-radius: 0.375rem;
308
640
  }
309
641
 
310
642
  .dropdown-item[aria-current="page"]:hover {
311
643
  background-color: var(--bs-primary);
312
- filter: brightness(0.9);
644
+ filter: brightness(0.95);
313
645
  }
314
646
 
315
647
  // -----------------------------------------------------------------------------
316
648
  // Dropdown Styling
649
+ // Modern, accessible dropdown design
317
650
  // -----------------------------------------------------------------------------
318
651
 
319
652
  .nav-hover-dropdown .dropdown-menu {
320
- border-radius: 0.375rem;
321
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
653
+ border-radius: 0.5rem;
654
+ box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.175);
655
+ border: 1px solid var(--bs-border-color-translucent);
656
+ padding: 0.5rem;
657
+
658
+ @media (prefers-color-scheme: dark) {
659
+ box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.4);
660
+ }
322
661
  }
323
662
 
324
663
  .nav-hover-dropdown .dropdown-item {
325
- padding: 0.5rem 1rem;
326
- min-height: 44px;
664
+ padding: 0.625rem 1rem;
665
+ min-height: 48px; // WCAG touch target
327
666
  display: flex;
328
667
  align-items: center;
668
+ border-radius: 0.375rem;
669
+ transition: all 0.15s ease-in-out;
670
+ margin-bottom: 0.125rem;
671
+
672
+ &:last-child {
673
+ margin-bottom: 0;
674
+ }
675
+
676
+ i {
677
+ font-size: 1rem;
678
+ width: 1.5rem;
679
+ transition: transform 0.15s ease-in-out;
680
+ }
681
+
682
+ &:hover {
683
+ background-color: var(--bs-tertiary-bg);
684
+
685
+ // translateX widens overflow; desktop menus sit inside a clipped nav track
686
+ @media (max-width: 991.98px) {
687
+ transform: translateX(4px);
688
+ }
689
+
690
+ i {
691
+ transform: scale(1.1);
692
+ }
693
+ }
694
+
695
+ &:focus-visible {
696
+ outline: 2px solid var(--bs-primary);
697
+ outline-offset: -2px;
698
+ }
699
+
700
+ &:active {
701
+ @media (max-width: 991.98px) {
702
+ transform: translateX(2px);
703
+ }
704
+ }
329
705
  }
330
706
 
331
- .nav-hover-dropdown .dropdown-item:hover {
332
- background-color: var(--bs-tertiary-bg);
707
+ // Dropdown divider styling
708
+ .nav-hover-dropdown .dropdown-divider {
709
+ margin: 0.5rem 0;
710
+ border-color: var(--bs-border-color-translucent);
333
711
  }
334
712
 
335
713
  // -----------------------------------------------------------------------------
336
714
  // Site Title Responsiveness
715
+ // Better text overflow handling across all sizes
337
716
  // -----------------------------------------------------------------------------
338
717
 
339
718
  .site-title-text {
340
719
  display: inline-block;
720
+ transition: max-width 0.3s ease-in-out;
341
721
  }
342
722
 
343
723
  @media (max-width: 767.98px) {
344
724
  .site-title-text {
345
- max-width: 55vw;
725
+ max-width: 60vw; // Increased from 55vw for better readability
346
726
  overflow: hidden;
347
727
  text-overflow: ellipsis;
348
728
  white-space: nowrap;
@@ -351,7 +731,14 @@
351
731
 
352
732
  @media (max-width: 575.98px) {
353
733
  .site-title-text {
354
- max-width: 45vw;
734
+ max-width: 50vw; // Increased from 45vw
735
+ }
736
+ }
737
+
738
+ @media (max-width: 375px) {
739
+ // Extra small devices (e.g., iPhone SE)
740
+ .site-title-text {
741
+ max-width: 40vw;
355
742
  }
356
743
  }
357
744
 
@@ -387,4 +774,70 @@
387
774
  .tab-content {
388
775
  padding-top: 1rem;
389
776
  }
777
+
778
+ // Theme switcher (halfmoon): avoid stretched static menu inside scrollable modal; Popper uses strategy fixed from markup
779
+ .bd-theme-dropdown {
780
+ position: relative;
781
+ }
782
+
783
+ .bd-theme-menu.dropdown-menu {
784
+ --bs-dropdown-min-width: 10.5rem;
785
+ z-index: 1060;
786
+ padding-top: 0.35rem;
787
+ padding-bottom: 0.35rem;
788
+ border-radius: var(--bs-border-radius, 0.375rem);
789
+ border: 1px solid var(--bs-border-color-translucent);
790
+ }
791
+
792
+ .bd-theme-menu .dropdown-item {
793
+ min-height: 0;
794
+ padding: 0.45rem 0.85rem;
795
+ font-size: 0.9375rem;
796
+ border-radius: calc(var(--bs-border-radius, 0.375rem) - 2px);
797
+ gap: 0.35rem;
798
+
799
+ &.active {
800
+ font-weight: 600;
801
+ }
802
+
803
+ .bi.ms-auto {
804
+ opacity: 0.9;
805
+ }
806
+ }
807
+ }
808
+
809
+ // -----------------------------------------------------------------------------
810
+ // Navigation Tooltips
811
+ // Enhanced tooltips for compact desktop view
812
+ // -----------------------------------------------------------------------------
813
+
814
+ .nav-tooltip {
815
+ .tooltip-inner {
816
+ padding: 0.5rem 0.75rem;
817
+ font-size: 0.875rem;
818
+ font-weight: 500;
819
+ border-radius: 0.375rem;
820
+ box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.15);
821
+ }
822
+
823
+ &.bs-tooltip-bottom .tooltip-arrow::before {
824
+ border-bottom-color: var(--bs-tooltip-bg);
825
+ }
826
+
827
+ &.bs-tooltip-top .tooltip-arrow::before {
828
+ border-top-color: var(--bs-tooltip-bg);
829
+ }
830
+ }
831
+
832
+ // Show tooltips only in compact desktop view (992-1199px)
833
+ @media (min-width: 1200px) {
834
+ .nav-tooltip {
835
+ display: none !important;
836
+ }
837
+ }
838
+
839
+ @media (max-width: 991.98px) {
840
+ .nav-tooltip {
841
+ display: none !important;
842
+ }
390
843
  }