@dataengineeringformachinelearning/viking-ui 1.0.2 → 3.0.0-alpha.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.
Files changed (129) hide show
  1. package/README.md +180 -41
  2. package/dist/deml-components.css +1122 -0
  3. package/dist/design-tokens.css +688 -0
  4. package/dist/elements/button/viking-button.d.ts +14 -0
  5. package/dist/elements/card/viking-card.d.ts +8 -0
  6. package/dist/elements/core/dom.d.ts +4 -0
  7. package/dist/elements/core/styles.d.ts +2 -0
  8. package/dist/elements/modal/viking-modal.d.ts +15 -0
  9. package/dist/fonts/inter/InterVariable-Italic.woff2 +0 -0
  10. package/dist/fonts/inter/InterVariable.woff2 +0 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +4051 -0
  13. package/dist/lib/core/brand-icons.d.ts +29 -0
  14. package/dist/lib/core/icons.d.ts +132 -0
  15. package/dist/lib/core/integration-brand-icons.d.ts +18 -0
  16. package/dist/lib/core/lucide-paths.generated.d.ts +90 -0
  17. package/dist/lib/site-drakkar/site-drakkar.config.d.ts +50 -0
  18. package/dist/lib/site-drakkar/suite-search-items.d.ts +17 -0
  19. package/dist/viking-components.css +1837 -0
  20. package/dist/viking-tokens.json +318 -0
  21. package/dist/viking-ui-elements.js +1750 -0
  22. package/dist/viking-ui.css +1 -0
  23. package/dist/web/badge/viking-badge-wc.d.ts +28 -0
  24. package/dist/web/button/viking-button-wc.d.ts +28 -0
  25. package/dist/web/callout/viking-callout-wc.d.ts +27 -0
  26. package/dist/web/card/viking-card-wc.d.ts +29 -0
  27. package/dist/web/core/base.d.ts +12 -0
  28. package/dist/web/core/dom.d.ts +11 -0
  29. package/dist/web/core/icons-inline.d.ts +7 -0
  30. package/dist/web/core/styles.d.ts +12 -0
  31. package/dist/web/core/types.d.ts +10 -0
  32. package/dist/web/field/viking-field-wc.d.ts +32 -0
  33. package/dist/web/index.d.ts +15 -0
  34. package/dist/web/input/viking-input-wc.d.ts +32 -0
  35. package/dist/web/modal/viking-modal-wc.d.ts +50 -0
  36. package/dist/web/search-palette/viking-search-palette-wc.d.ts +64 -0
  37. package/dist/web/select/viking-select-wc.d.ts +48 -0
  38. package/dist/web/suite-header/viking-suite-header-wc.d.ts +36 -0
  39. package/dist/web/suite-search-palette/viking-suite-search-palette-wc.d.ts +39 -0
  40. package/dist/web/theme-toggle/viking-theme-toggle-wc.d.ts +19 -0
  41. package/dist/web/types.d.ts +40 -0
  42. package/dist/web-components/index.d.ts +1 -0
  43. package/dist/web-components.js +1750 -0
  44. package/dist/widget.js +1182 -0
  45. package/package.json +89 -30
  46. package/src/assets/fonts/inter/InterVariable-Italic.woff2 +0 -0
  47. package/src/assets/fonts/inter/InterVariable.woff2 +0 -0
  48. package/src/elements/button/viking-button.ts +201 -0
  49. package/src/elements/card/viking-card.ts +60 -0
  50. package/src/elements/core/dom.ts +33 -0
  51. package/src/elements/core/styles.ts +28 -0
  52. package/src/elements/modal/viking-modal.ts +154 -0
  53. package/src/index.ts +1 -0
  54. package/src/lib/core/brand-icons.ts +62 -0
  55. package/src/lib/core/icons.ts +206 -0
  56. package/src/lib/core/integration-brand-icons.ts +77 -0
  57. package/src/lib/core/lucide-paths.generated.ts +130 -0
  58. package/src/lib/site-drakkar/site-drakkar.config.ts +295 -0
  59. package/src/lib/site-drakkar/suite-search-items.ts +246 -0
  60. package/src/styles/_buttons.scss +301 -0
  61. package/src/styles/_component-primitives.scss +183 -0
  62. package/src/styles/_drakkar-buttons.scss +85 -0
  63. package/src/styles/_fonts.scss +22 -0
  64. package/src/styles/_forms.scss +66 -0
  65. package/src/styles/_input.scss +106 -0
  66. package/src/styles/_layout-enforcement.scss +166 -0
  67. package/src/styles/_layout-rhythm.scss +158 -0
  68. package/src/styles/_legacy-aliases.scss +212 -0
  69. package/src/styles/_series-colors.scss +24 -0
  70. package/src/styles/_static-primitives.scss +857 -0
  71. package/src/styles/_typography.scss +87 -0
  72. package/src/styles/_variables.scss +527 -0
  73. package/src/styles/components/a11y.scss +90 -0
  74. package/src/styles/components/badges.scss +102 -0
  75. package/src/styles/components/extracted-utilities.scss +459 -0
  76. package/src/styles/components/footer.scss +155 -0
  77. package/src/styles/components/icon-heading.scss +47 -0
  78. package/src/styles/components/icon-inline.scss +78 -0
  79. package/src/styles/components/layout.scss +59 -0
  80. package/src/styles/components/utilities.scss +131 -0
  81. package/src/styles/components/viking-inspired.scss +204 -0
  82. package/src/styles/components/whitepaper-cta.scss +130 -0
  83. package/src/styles/components-bundle.scss +9 -0
  84. package/src/styles/components.scss +175 -0
  85. package/src/styles/deml-components.scss +10 -0
  86. package/src/styles/index.scss +8 -0
  87. package/src/styles/layout-shell.scss +39 -11
  88. package/src/styles/page-shell.scss +663 -33
  89. package/src/styles/static-navbar.scss +862 -146
  90. package/src/styles/surfaces/backend.scss +142 -0
  91. package/src/styles/surfaces/docs-global.scss +73 -0
  92. package/src/styles/surfaces/docs-shell.scss +412 -0
  93. package/src/styles/surfaces/docs-showcase.scss +1051 -0
  94. package/src/styles/surfaces/marketing-cta.scss +62 -0
  95. package/src/styles/surfaces/marketing-docs-bento.scss +67 -0
  96. package/src/styles/surfaces/marketing-global.scss +748 -0
  97. package/src/styles/surfaces/marketing-landing.scss +1260 -0
  98. package/src/styles/surfaces/marketing-publication.scss +535 -0
  99. package/src/styles/surfaces/marketing-theme.scss +14 -0
  100. package/src/styles/surfaces/swagger-ui.scss +921 -0
  101. package/src/styles/tokens-export.scss +18 -0
  102. package/src/styles/tokens.scss +5 -0
  103. package/src/styles/viking-ui-bundle.scss +20 -2
  104. package/src/styles/viking-ui.scss +213 -51
  105. package/src/tokens/viking-tokens.json +318 -0
  106. package/src/web/badge/viking-badge-wc.ts +116 -0
  107. package/src/web/button/viking-button-wc.ts +165 -0
  108. package/src/web/callout/viking-callout-wc.ts +105 -0
  109. package/src/web/card/viking-card-wc.ts +66 -0
  110. package/src/web/core/base.ts +56 -0
  111. package/src/web/core/dom.ts +53 -0
  112. package/src/web/core/icons-inline.ts +44 -0
  113. package/src/web/core/styles.ts +1138 -0
  114. package/src/web/core/types.ts +19 -0
  115. package/src/web/field/viking-field-wc.ts +154 -0
  116. package/src/web/index.ts +73 -0
  117. package/src/web/input/viking-input-wc.ts +211 -0
  118. package/src/web/modal/viking-modal-wc.ts +187 -0
  119. package/src/web/search-palette/viking-search-palette-wc.ts +494 -0
  120. package/src/web/select/viking-select-wc.ts +218 -0
  121. package/src/web/suite-header/viking-suite-header-wc.ts +714 -0
  122. package/src/web/suite-search-palette/viking-suite-search-palette-wc.ts +234 -0
  123. package/src/web/theme-toggle/viking-theme-toggle-wc.ts +139 -0
  124. package/src/web/types.ts +37 -0
  125. package/src/web-components/index.ts +1 -0
  126. package/fesm2022/dataengineeringformachinelearning-viking-ui.mjs +0 -6114
  127. package/fesm2022/dataengineeringformachinelearning-viking-ui.mjs.map +0 -1
  128. package/types/dataengineeringformachinelearning-viking-ui.d.ts +0 -1397
  129. package/viking.manifest.json +0 -238
@@ -1,28 +1,101 @@
1
1
  // Shared navbar + theme toggle (frontend Angular, marketing Astro, backend Django).
2
+ @use 'drakkar-buttons' as *;
3
+
4
+ @mixin viking-navbar-search-shell-focus {
5
+ outline: var(--viking-ring-width, 2px) solid var(--viking-ring, var(--viking-ring));
6
+ outline-offset: var(--viking-ring-offset, 2px);
7
+ }
8
+
9
+ @mixin viking-navbar-utility-btn {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ flex-shrink: 0;
14
+ width: var(--viking-control-height, 40px);
15
+ height: var(--viking-control-height, 40px);
16
+ min-width: var(--viking-control-height, 40px);
17
+ padding: 0;
18
+ margin: 0;
19
+ border: 1px solid var(--viking-border-strong, var(--border));
20
+ border-radius: var(--viking-radius, 8px);
21
+ background: var(--viking-surface, var(--card-bg));
22
+ color: var(--viking-text, var(--text-color));
23
+ box-shadow: var(--viking-shadow-sm, var(--shadow-sm));
24
+ cursor: pointer;
25
+ transition: var(--viking-transition-interactive, all 0.25s ease);
26
+
27
+ &:hover {
28
+ border-color: var(--viking-accent-strong, var(--viking-ring));
29
+ background: var(--viking-surface-alt, var(--viking-charcoal-700));
30
+ color: var(--viking-text, var(--text-color));
31
+ box-shadow: var(--viking-shadow-md, var(--shadow-md));
32
+ }
33
+
34
+ &:focus-visible {
35
+ @include viking-navbar-search-shell-focus;
36
+ }
37
+ }
38
+
39
+ @mixin viking-navbar-search-shell {
40
+ display: flex;
41
+ align-items: center;
42
+ gap: var(--viking-space-1, 8px);
43
+ min-height: var(--viking-control-height, 40px);
44
+ padding: 0 var(--viking-space-2, 16px);
45
+ background: var(--viking-surface, var(--card-bg));
46
+ border: 1px solid var(--viking-border-strong, var(--border));
47
+ border-radius: var(--viking-radius, 8px);
48
+ box-shadow: var(--viking-shadow-sm, var(--shadow-sm));
49
+ transition: var(--viking-transition-interactive, border-color 0.25s ease, box-shadow 0.25s ease);
50
+
51
+ &:hover {
52
+ border-color: color-mix(in srgb, var(--viking-accent-strong, var(--viking-ring)) 55%, var(--viking-border-strong, var(--border)));
53
+ box-shadow: var(--viking-shadow-md, var(--shadow-md));
54
+ }
55
+ }
56
+
57
+ @mixin viking-navbar-search-panel {
58
+ margin: 0;
59
+ padding: var(--viking-space-1, 8px);
60
+ background: var(--viking-surface, var(--card-bg));
61
+ border: 1px solid var(--viking-border-strong, var(--border));
62
+ border-radius: var(--viking-radius, 8px);
63
+ box-shadow: var(--viking-shadow-md, var(--shadow-md));
64
+ max-height: 288px;
65
+ overflow: auto;
66
+ font-family: var(--viking-font-family, inherit);
67
+ }
2
68
 
3
69
  .navbar {
4
70
  position: sticky;
5
71
  top: 0;
6
72
  z-index: 50;
7
73
  width: 100%;
8
- min-height: var(--navbar-height, 64px);
9
- background-color: var(--navbar-bg);
10
- backdrop-filter: blur(12px);
11
- -webkit-backdrop-filter: blur(12px);
12
- border-bottom: 1px solid var(--border-layout);
74
+ min-height: var(--viking-navbar-height, 64px);
75
+ background-color: var(--navbar-bg, var(--viking-surface));
76
+ border-bottom: 1px solid var(--border-layout, var(--viking-border));
13
77
  display: flex;
14
78
  flex-direction: column;
15
79
  align-items: stretch;
16
- padding: 9px 24px;
80
+ padding: 0 var(--viking-space-2, 16px);
17
81
  box-sizing: border-box;
82
+ overflow: visible;
83
+ container-type: inline-size;
84
+ container-name: viking-navbar;
85
+
86
+ @media (min-width: 768px) {
87
+ padding-inline: var(--viking-space-3, 24px);
88
+ }
89
+ box-shadow: var(--viking-shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.2));
90
+ isolation: isolate;
18
91
  }
19
92
 
20
93
  .navbar-brand {
21
- margin-right: 8px;
94
+ margin-right: var(--viking-space-1, 8px);
22
95
  display: inline-flex;
23
96
  align-items: center;
24
97
  justify-content: center;
25
- gap: 8px;
98
+ gap: var(--viking-space-1, 8px);
26
99
  text-decoration: none;
27
100
  overflow: visible;
28
101
  flex-shrink: 0;
@@ -45,7 +118,7 @@
45
118
  width: 36px;
46
119
  height: 36px;
47
120
  line-height: 1;
48
- color: var(--color-primary);
121
+ color: var(--color-primary, var(--viking-accent));
49
122
  overflow: visible;
50
123
  flex-shrink: 0;
51
124
  display: inline-flex;
@@ -53,6 +126,11 @@
53
126
  justify-content: center;
54
127
  }
55
128
 
129
+ .navbar-brand .navbar-logo,
130
+ .navbar-brand viking-icon.navbar-logo {
131
+ color: var(--color-primary, var(--viking-accent)) !important;
132
+ }
133
+
56
134
  // Angular mat-icon defaults to overflow:hidden — clips ligature glyphs at tight sizes.
57
135
  .navbar-brand .navbar-logo.mat-icon,
58
136
  .navbar-brand mat-icon.navbar-logo {
@@ -69,75 +147,158 @@
69
147
  }
70
148
 
71
149
  .navbar-content {
72
- display: flex;
150
+ display: grid;
151
+ grid-template-columns: auto 1fr auto;
73
152
  align-items: center;
74
- justify-content: space-between;
153
+ gap: var(--viking-space-1, 8px);
75
154
  width: 100%;
76
- max-width: none;
77
- margin: 0;
155
+ max-width: var(--viking-container-max-width, 1260px);
156
+ margin-inline: auto;
157
+ min-width: 0;
158
+ min-height: var(--viking-navbar-height, 64px);
78
159
  }
79
160
 
80
161
  .navbar-left {
81
- flex: 1;
162
+ grid-column: 1;
82
163
  display: flex;
83
164
  align-items: center;
84
165
  justify-content: flex-start;
166
+ flex: 0 1 auto;
167
+ min-width: 0;
168
+ flex-shrink: 0;
85
169
  }
86
170
 
87
171
  .navbar-right {
88
- flex: 1;
172
+ grid-column: 3;
89
173
  display: flex;
90
174
  align-items: center;
91
175
  justify-content: flex-end;
92
- gap: 8px;
176
+ flex: 0 0 auto;
177
+ gap: var(--viking-space-1, 8px);
178
+ min-width: 0;
179
+ flex-shrink: 0;
180
+ }
181
+
182
+ .navbar-search,
183
+ .navbar-search viking-button-wc,
184
+ .navbar-right viking-theme-toggle-wc,
185
+ .navbar-right .menu-toggle-btn,
186
+ .navbar-right viking-button.menu-toggle-btn,
187
+ .navbar-right viking-button-wc.menu-toggle-btn {
188
+ flex: 0 0 auto;
93
189
  }
94
190
 
95
191
  .navbar-center {
192
+ grid-column: 2;
96
193
  display: flex;
97
194
  justify-content: center;
195
+ align-items: center;
196
+ min-width: 0;
98
197
  }
99
198
 
100
199
  .desktop-nav {
101
200
  display: none;
201
+ flex-direction: row;
202
+ flex-wrap: nowrap;
102
203
  align-items: center;
103
- gap: 12px;
104
- padding: 4px 0;
204
+ gap: var(--viking-space-1, 8px);
205
+ padding: var(--viking-space-half, 4px) 0;
206
+ min-width: 0;
207
+ max-width: 100%;
208
+ overflow: hidden;
105
209
  }
106
210
 
107
211
  .desktop-auth {
108
212
  display: none;
109
213
  align-items: center;
110
- gap: 8px;
214
+ flex-shrink: 0;
215
+ gap: var(--viking-space-1, 8px);
216
+
217
+ viking-button,
218
+ viking-button-wc {
219
+ min-width: auto;
220
+ }
111
221
  }
112
222
 
113
223
  .nav-btn {
114
224
  position: relative;
115
- font-size: 1rem !important;
225
+ font-size: var(--viking-font-size-sm, 14px) !important;
116
226
  color: var(--nav-link-color, var(--text-muted)) !important;
117
227
  font-weight: 600 !important;
118
228
  text-transform: uppercase !important;
119
- letter-spacing: 0.08em !important;
229
+ letter-spacing: 0.06em !important;
120
230
  transition:
121
231
  color 0.2s ease,
122
232
  background-color 0.2s ease,
123
233
  box-shadow 0.2s ease,
124
234
  transform 0.2s ease !important;
125
235
  border-radius: var(--border-radius-sm) var(--border-radius-sm) 0 0 !important;
126
- padding: 0 16px !important;
127
- height: 40px !important;
128
- line-height: 40px !important;
236
+ padding: 0 var(--viking-space-1-5, 12px) !important;
237
+ height: var(--viking-control-height, 40px) !important;
238
+ line-height: var(--viking-control-height, 40px) !important;
129
239
  display: inline-flex !important;
130
240
  align-items: center !important;
131
- gap: 8px !important;
241
+ gap: 6px !important;
132
242
  text-decoration: none;
133
243
  background: transparent;
134
244
  border: none;
135
245
  cursor: pointer;
136
246
  overflow: hidden;
247
+ flex-shrink: 1;
248
+ min-width: 0;
249
+ white-space: nowrap;
137
250
  }
138
251
 
139
- .nav-btn .material-icons {
252
+ .nav-btn[hidden],
253
+ .mobile-nav-btn[hidden] {
254
+ display: none !important;
255
+ }
256
+
257
+ .nav-btn .material-icons,
258
+ .nav-btn svg,
259
+ .nav-btn .viking-icon,
260
+ .nav-btn [data-viking-icon],
261
+ .mobile-nav-btn svg,
262
+ .mobile-nav-btn [data-viking-icon],
263
+ .auth-btn svg,
264
+ .auth-btn [data-viking-icon],
265
+ .theme-toggle-btn svg,
266
+ .menu-toggle-btn svg,
267
+ .navbar-search-trigger [data-viking-icon],
268
+ .navbar-search-mobile-btn [data-viking-icon] {
140
269
  margin: 0;
270
+ flex-shrink: 0;
271
+ }
272
+
273
+ .nav-btn svg,
274
+ .mobile-nav-btn svg,
275
+ .auth-btn svg,
276
+ .nav-btn [data-viking-icon] svg,
277
+ .mobile-nav-btn [data-viking-icon] svg,
278
+ .auth-btn [data-viking-icon] svg {
279
+ width: 16px;
280
+ height: 16px;
281
+ }
282
+
283
+ .theme-toggle-btn svg,
284
+ .menu-toggle-btn svg,
285
+ .navbar-search-trigger svg,
286
+ .navbar-search-mobile-btn svg,
287
+ .theme-toggle-btn [data-viking-icon] svg,
288
+ .menu-toggle-btn [data-viking-icon] svg,
289
+ .navbar-search-trigger [data-viking-icon] svg,
290
+ .navbar-search-mobile-btn [data-viking-icon] svg {
291
+ width: 24px;
292
+ height: 24px;
293
+ }
294
+
295
+ .navbar-search-trigger [data-viking-icon] svg,
296
+ .navbar-search-mobile-btn [data-viking-icon] svg {
297
+ width: 20px;
298
+ height: 20px;
299
+ }
300
+
301
+ .nav-btn .material-icons {
141
302
  font-size: var(--base-font-size);
142
303
  width: 16px;
143
304
  height: 16px;
@@ -152,7 +313,7 @@
152
313
  background: linear-gradient(
153
314
  90deg,
154
315
  transparent,
155
- color-mix(in srgb, var(--crayola-blue) 80%, transparent),
316
+ color-mix(in srgb, var(--viking-accent) 80%, transparent),
156
317
  transparent
157
318
  );
158
319
  opacity: 0;
@@ -165,7 +326,7 @@
165
326
 
166
327
  .nav-btn:hover {
167
328
  color: var(--text-color) !important;
168
- background-color: color-mix(in srgb, var(--crayola-blue) 10%, transparent) !important;
329
+ background-color: color-mix(in srgb, var(--viking-accent) 10%, transparent) !important;
169
330
  transform: translateY(-1px);
170
331
  }
171
332
 
@@ -175,27 +336,32 @@
175
336
  }
176
337
 
177
338
  html[data-theme='light'] {
178
- --nav-link-color: color-mix(in srgb, var(--jet-black) 88%, var(--white));
339
+ --nav-link-color: color-mix(in srgb, var(--viking-charcoal-900) 88%, var(--white));
179
340
 
180
341
  .nav-btn,
181
- .mobile-nav-btn,
182
- .menu-toggle-btn,
183
- .theme-toggle-btn {
342
+ .mobile-nav-btn {
184
343
  color: var(--nav-link-color) !important;
185
344
  }
186
345
 
346
+ .menu-toggle-btn,
347
+ .theme-toggle-btn,
348
+ .navbar-search-trigger,
349
+ .navbar-search-mobile-btn {
350
+ color: var(--viking-text, var(--text-color)) !important;
351
+ }
352
+
187
353
  .nav-btn:hover,
188
354
  .mobile-nav-btn:hover {
189
- background-color: color-mix(in srgb, var(--crayola-blue) 10%, transparent) !important;
355
+ background-color: color-mix(in srgb, var(--viking-accent) 10%, transparent) !important;
190
356
  }
191
357
  }
192
358
 
193
359
  .nav-btn.active {
194
360
  color: var(--text-color) !important;
195
- background-color: color-mix(in srgb, var(--crayola-blue) 14%, transparent) !important;
361
+ background-color: color-mix(in srgb, var(--viking-accent) 14%, transparent) !important;
196
362
  box-shadow:
197
- inset 0 -2px 0 0 var(--crayola-blue),
198
- 0 0 12px color-mix(in srgb, var(--crayola-blue) 18%, transparent) !important;
363
+ inset 0 -2px 0 0 var(--viking-accent),
364
+ 0 0 12px color-mix(in srgb, var(--viking-accent) 18%, transparent) !important;
199
365
  }
200
366
 
201
367
  .nav-btn.active::before {
@@ -205,66 +371,100 @@ html[data-theme='light'] {
205
371
 
206
372
  .navbar .theme-toggle-btn,
207
373
  .theme-toggle-btn {
208
- position: static;
209
- background: transparent;
210
- color: var(--text-muted);
211
- border: none;
212
- border-radius: 50%;
213
- width: 48px;
214
- height: 48px;
215
- min-width: 48px;
374
+ @include viking-navbar-utility-btn;
375
+ display: inline-grid;
376
+ place-items: center;
216
377
  padding: 0;
217
- margin: 0;
218
- display: inline-flex;
219
- align-items: center;
220
- justify-content: center;
221
- cursor: pointer;
222
- box-shadow: none;
223
- flex-shrink: 0;
224
- transition:
225
- color 0.2s ease,
226
- transform 0.2s ease,
227
- background-color 0.2s ease;
378
+ border-color: color-mix(
379
+ in srgb,
380
+ var(--viking-accent, var(--viking-accent)) 32%,
381
+ var(--viking-border-strong, var(--border))
382
+ );
383
+ background: color-mix(
384
+ in srgb,
385
+ var(--viking-accent, var(--viking-accent)) 8%,
386
+ var(--viking-surface, var(--card-bg))
387
+ );
388
+ color: var(--viking-accent-strong, var(--viking-ring));
389
+
390
+ svg,
391
+ viking-icon {
392
+ display: block;
393
+ width: 24px;
394
+ height: 24px;
395
+ }
396
+
397
+ &:hover {
398
+ border-color: var(--viking-accent-strong, var(--viking-ring));
399
+ background-color: color-mix(
400
+ in srgb,
401
+ var(--viking-accent, var(--viking-accent)) 14%,
402
+ var(--viking-surface, var(--card-bg))
403
+ );
404
+ color: var(--viking-accent-strong, var(--viking-ring));
405
+ box-shadow: var(--viking-shadow-md, var(--shadow-md));
406
+ }
407
+
408
+ &:active {
409
+ transform: scale(var(--viking-state-active-scale, 0.98));
410
+ }
228
411
  }
229
412
 
230
413
  .navbar .theme-toggle-btn .material-icons,
231
- .theme-toggle-btn .material-icons {
232
- font-size: 24px;
414
+ .navbar .theme-toggle-btn svg,
415
+ .theme-toggle-btn .material-icons,
416
+ .theme-toggle-btn svg {
233
417
  width: 24px;
234
418
  height: 24px;
235
- line-height: 24px;
236
419
  }
237
420
 
238
- .navbar .theme-toggle-btn:hover,
239
- .theme-toggle-btn:hover {
240
- color: var(--text-color);
241
- transform: rotate(15deg);
242
- background-color: rgba(33, 118, 255, 0.05);
243
- box-shadow: none;
421
+ .menu-toggle-btn,
422
+ viking-button.menu-toggle-btn,
423
+ viking-button-wc.menu-toggle-btn,
424
+ #navbar-search-trigger {
425
+ @include viking-navbar-utility-btn;
426
+ display: inline-grid !important;
427
+ place-items: center;
428
+ padding: 0;
429
+
430
+ svg,
431
+ viking-icon {
432
+ display: block;
433
+ width: 24px;
434
+ height: 24px;
435
+ }
244
436
  }
245
437
 
246
- .navbar .theme-toggle-btn:focus-visible,
247
- .theme-toggle-btn:focus-visible {
248
- outline: 2px solid var(--color-primary-container);
249
- outline-offset: 3px;
438
+ .navbar-search viking-button-wc::part(control),
439
+ viking-button-wc.menu-toggle-btn::part(control),
440
+ .navbar-right viking-theme-toggle-wc::part(control) {
441
+ display: inline-grid;
442
+ place-items: center;
443
+ width: var(--viking-control-height, 40px);
444
+ min-width: var(--viking-control-height, 40px);
445
+ max-width: var(--viking-control-height, 40px);
446
+ height: var(--viking-control-height, 40px);
447
+ min-height: var(--viking-control-height, 40px);
448
+ padding: 0;
449
+ line-height: 1;
450
+ box-sizing: border-box;
250
451
  }
251
452
 
252
- .menu-toggle-btn {
253
- display: inline-flex !important;
254
- color: var(--text-muted) !important;
255
- transition: color 0.2s;
256
- background: transparent;
257
- border: none;
258
- cursor: pointer;
453
+ .navbar-search viking-button-wc [data-viking-icon],
454
+ viking-button-wc.menu-toggle-btn [data-viking-icon] {
455
+ display: inline-flex;
259
456
  align-items: center;
260
457
  justify-content: center;
261
- width: 40px;
262
- height: 40px;
263
- border-radius: 50%;
458
+ width: var(--viking-icon-size-md, 20px);
459
+ height: var(--viking-icon-size-md, 20px);
460
+ line-height: 1;
264
461
  }
265
462
 
266
- .menu-toggle-btn:hover {
267
- color: var(--text-color) !important;
463
+ .menu-toggle-btn[aria-expanded='true'] {
464
+ border-color: var(--viking-accent, var(--viking-accent));
465
+ color: var(--viking-accent-strong, var(--viking-ring));
466
+ background: var(--viking-accent-soft, color-mix(in srgb, var(--viking-accent) 12%, transparent));
467
+ box-shadow: var(--viking-shadow-sm, var(--shadow-sm));
268
468
  }
269
469
 
270
470
  .divider {
@@ -274,62 +474,96 @@ html[data-theme='light'] {
274
474
  margin: 0 8px;
275
475
  }
276
476
 
277
- .auth-btn {
278
- background: var(--color-dark-grey-btn-bg) !important;
279
- color: var(--color-dark-grey-btn-text) !important;
280
- font-weight: 600 !important;
281
- border-radius: 96px !important;
282
- padding: 0 16px !important;
283
- box-shadow: var(--shadow-sm) !important;
477
+ .auth-btn .material-icons {
478
+ margin: 0;
479
+ font-size: var(--viking-font-size-sm, 14px);
480
+ width: 16px;
481
+ height: 16px;
482
+ }
483
+
484
+ .auth-btn,
485
+ a.auth-btn,
486
+ button.auth-btn {
487
+ display: inline-flex !important;
488
+ align-items: center !important;
489
+ justify-content: center !important;
490
+ gap: var(--viking-space-1, 8px) !important;
491
+ min-width: auto !important;
492
+ height: var(--viking-control-height, 40px) !important;
493
+ min-height: var(--viking-control-height, 40px) !important;
494
+ padding: 0 var(--viking-space-2, 16px) !important;
495
+ border-radius: var(--viking-radius, 8px) !important;
496
+ letter-spacing: var(--viking-letter-spacing-caps, 0.08em) !important;
284
497
  text-transform: uppercase !important;
285
- letter-spacing: 0.1em !important;
498
+ white-space: nowrap !important;
499
+ line-height: 1 !important;
500
+ }
501
+
502
+ .auth-signout-btn {
503
+ background: transparent !important;
504
+ color: var(--text-muted) !important;
505
+ font-weight: 600 !important;
506
+ border-radius: var(--viking-radius, 8px) !important;
507
+ padding: 0 var(--viking-space-2, 16px) !important;
286
508
  border: 1px solid var(--border) !important;
287
- transition: var(--transition-smooth) !important;
288
- height: 40px !important;
289
- line-height: 40px !important;
509
+ height: var(--viking-control-height, 40px) !important;
510
+ line-height: var(--viking-control-height, 40px) !important;
290
511
  display: inline-flex !important;
291
512
  align-items: center !important;
292
- gap: 8px !important;
513
+ gap: var(--viking-space-1, 8px) !important;
293
514
  white-space: nowrap !important;
294
- text-decoration: none;
515
+ text-transform: uppercase !important;
516
+ letter-spacing: 0.08em !important;
295
517
  cursor: pointer;
518
+ transition: var(--viking-transition-interactive) !important;
296
519
  }
297
520
 
298
- .auth-btn .material-icons {
299
- margin: 0;
300
- font-size: var(--base-font-size);
301
- width: 16px;
302
- height: 16px;
303
- transition: transform 0.3s ease;
521
+ .auth-signout-btn[hidden] {
522
+ display: none !important;
304
523
  }
305
524
 
306
- .auth-btn:hover {
307
- transform: translateY(-2px) !important;
308
- background-color: var(--crayola-blue) !important;
309
- border-color: var(--crayola-blue) !important;
310
- color: var(--white) !important;
311
- box-shadow: var(--shadow-md) !important;
525
+ .auth-signout-btn:hover {
526
+ color: var(--text-color) !important;
527
+ border-color: var(--viking-crimson-500) !important;
528
+ background: color-mix(in srgb, var(--viking-crimson-500) 10%, transparent) !important;
312
529
  }
313
530
 
314
- .auth-btn:hover .material-icons {
315
- transform: translateX(2px);
531
+ .mobile-menu:not(.open) {
532
+ display: none !important;
316
533
  }
317
534
 
318
535
  .mobile-menu {
319
536
  display: none;
320
537
  flex-direction: column;
321
538
  position: absolute;
322
- top: 64px;
539
+ top: var(--viking-navbar-height, var(--navbar-height, 64px));
323
540
  left: 0;
324
541
  right: 0;
325
542
  width: auto;
326
- background-color: var(--card-bg);
327
- box-shadow: var(--shadow-md);
328
- border-bottom: 1px solid var(--border);
329
- padding: 24px;
543
+ max-height: calc(100dvh - var(--viking-navbar-height, var(--navbar-height, 64px)));
544
+ overflow-x: hidden;
545
+ overflow-y: auto;
546
+ overscroll-behavior: contain;
547
+ -webkit-overflow-scrolling: touch;
548
+ background-color: var(--viking-surface, var(--card-bg));
549
+ box-shadow: var(--viking-shadow-md, var(--shadow-md));
550
+ border-bottom: 1px solid var(--viking-border, var(--border));
551
+ padding: var(--viking-space-3, 24px);
552
+ padding-bottom: calc(var(--viking-space-3, 24px) + env(safe-area-inset-bottom, 0px));
330
553
  box-sizing: border-box;
331
554
  z-index: 49;
332
- gap: 8px;
555
+ gap: var(--viking-space-half, 4px);
556
+
557
+ viking-button {
558
+ width: 100%;
559
+ }
560
+
561
+ .mobile-auth-btn,
562
+ .auth-signout-btn {
563
+ flex-shrink: 0;
564
+ width: 100%;
565
+ }
566
+
333
567
  transform: translateY(-10px);
334
568
  opacity: 0;
335
569
  pointer-events: none;
@@ -348,16 +582,21 @@ html[data-theme='light'] {
348
582
  .mobile-nav-btn {
349
583
  width: 100% !important;
350
584
  justify-content: flex-start !important;
351
- font-size: 1rem !important;
352
- color: var(--text-muted) !important;
353
- height: 40px !important;
354
- line-height: 40px !important;
355
- border-radius: var(--border-radius-sm) !important;
356
- padding: 0 16px !important;
585
+ font-size: var(--viking-font-size-sm, 14px) !important;
586
+ font-weight: 600 !important;
587
+ text-transform: uppercase !important;
588
+ letter-spacing: 0.06em !important;
589
+ color: var(--viking-text-muted, var(--text-muted)) !important;
590
+ min-height: 44px !important;
591
+ border-radius: var(--viking-radius, 8px) !important;
592
+ padding: 0 var(--viking-space-2, 16px) !important;
357
593
  display: inline-flex !important;
358
594
  align-items: center !important;
359
- gap: 8px !important;
595
+ gap: var(--viking-space-1, 8px) !important;
360
596
  text-decoration: none;
597
+ border: 1px solid transparent;
598
+ background: transparent;
599
+ transition: var(--viking-transition-interactive, all 0.25s ease);
361
600
  }
362
601
 
363
602
  .mobile-nav-btn .material-icons {
@@ -368,37 +607,31 @@ html[data-theme='light'] {
368
607
  }
369
608
 
370
609
  .mobile-nav-btn:hover {
371
- color: var(--text-color) !important;
372
- background-color: rgba(33, 118, 255, 0.05) !important;
610
+ color: var(--viking-text, var(--text-color)) !important;
611
+ background-color: var(--viking-accent-soft, color-mix(in srgb, var(--viking-accent) 8%, transparent)) !important;
373
612
  }
374
613
 
375
614
  .mobile-nav-btn.active {
376
- color: var(--text-color) !important;
377
- background-color: rgba(33, 118, 255, 0.1) !important;
378
- box-shadow: inset 0 0 0 1px var(--crayola-blue) !important;
615
+ color: var(--viking-text, var(--text-color)) !important;
616
+ background-color: var(--viking-accent-soft, color-mix(in srgb, var(--viking-accent) 12%, transparent)) !important;
617
+ box-shadow: inset 0 0 0 1px var(--viking-accent-strong, var(--viking-ring)) !important;
379
618
  }
380
619
 
381
620
  .mobile-divider {
382
- height: 0px;
383
- background-color: var(--border);
384
- margin: 8px 0;
621
+ height: 1px;
622
+ background-color: var(--viking-border, var(--border));
623
+ margin: var(--viking-space-2, 16px) 0 var(--viking-space-1, 8px);
624
+ flex-shrink: 0;
385
625
  }
386
626
 
387
- .mobile-auth-btn {
388
- width: 100% !important;
389
- height: 40px !important;
390
- line-height: 40px !important;
391
- justify-content: center !important;
392
- border-radius: var(--border-radius-lg) !important;
393
- background: var(--color-dark-grey-btn-bg) !important;
394
- color: var(--color-dark-grey-btn-text) !important;
395
- font-weight: 600 !important;
396
- border: none !important;
397
- display: inline-flex !important;
398
- align-items: center !important;
399
- gap: 8px !important;
400
- white-space: nowrap !important;
401
- text-decoration: none;
627
+ .mobile-menu .mobile-auth-btn {
628
+ margin-top: var(--viking-space-half, 4px);
629
+ }
630
+
631
+ .mobile-menu a.mobile-auth-btn:not(.auth-signout-btn),
632
+ .mobile-menu a.mobile-auth-btn:not(.auth-signout-btn) span,
633
+ .mobile-menu a.mobile-auth-btn:not(.auth-signout-btn) svg {
634
+ color: var(--viking-white-pure, var(--viking-white-pure)) !important;
402
635
  }
403
636
 
404
637
  .navbar-link {
@@ -416,7 +649,7 @@ html[data-theme='light'] {
416
649
  }
417
650
 
418
651
  .glowing-icon-sm {
419
- color: var(--primary-text-color) !important;
652
+ color: var(--color-primary, var(--primary-text-color, var(--viking-accent))) !important;
420
653
  transition: all 0.3s ease;
421
654
  }
422
655
 
@@ -441,7 +674,451 @@ html[data-theme='light'] {
441
674
  filter: drop-shadow(0 0 10px color-mix(in srgb, var(--color-primary) 90%, transparent));
442
675
  }
443
676
 
677
+ // Algolia Experiences autocomplete — aligned with viking-autocomplete + search-palette.
678
+
679
+ .navbar-search {
680
+ display: inline-flex;
681
+ align-items: center;
682
+ align-self: center;
683
+ flex: 0 0 auto;
684
+ justify-content: center;
685
+ max-width: none;
686
+ min-width: 0;
687
+ min-height: var(--viking-control-height, 40px);
688
+ margin: 0;
689
+ line-height: 0;
690
+
691
+ viking-button,
692
+ viking-button-wc {
693
+ flex-shrink: 0;
694
+ }
695
+ }
696
+
697
+ .algolia-autocomplete-host {
698
+ display: none;
699
+ font-family: var(--viking-font-family, inherit);
700
+
701
+ --aa-font-family: var(--viking-font-family, inherit);
702
+ --aa-font-size: var(--viking-font-size-sm, 14px);
703
+ --aa-spacing: var(--viking-space-1, 8px);
704
+ --aa-spacing-half: var(--viking-space-half, 4px);
705
+ --aa-panel-max-height: 288px;
706
+ --aa-panel-shadow: var(--viking-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.25));
707
+ --aa-icon-size: 20px;
708
+ --aa-icon-stroke-width: 2px;
709
+ --aa-primary-color-rgb: 20, 163, 168;
710
+ --aa-muted-color-rgb: 148, 163, 184;
711
+ }
712
+
713
+ // Command-palette modal — matches viking-search-palette on every breakpoint.
714
+ .algolia-autocomplete-host.algolia-autocomplete-open {
715
+ display: flex;
716
+ align-items: flex-start;
717
+ justify-content: center;
718
+ position: fixed;
719
+ inset: 0;
720
+ z-index: var(--viking-z-overlay, 10001);
721
+ padding: 10vh var(--viking-space-2, 16px) var(--viking-space-2, 16px);
722
+ background: var(--viking-overlay-backdrop, rgba(0, 0, 0, 0.55));
723
+ backdrop-filter: blur(4px);
724
+ -webkit-backdrop-filter: blur(4px);
725
+ border: none;
726
+ box-shadow: none;
727
+ max-width: none;
728
+ width: auto;
729
+ min-width: 0;
730
+
731
+ .aa-Autocomplete,
732
+ .aa-DetachedContainer {
733
+ max-width: 600px;
734
+ width: 100%;
735
+ border: 1px solid var(--viking-border-strong, var(--viking-border, var(--border)));
736
+ border-radius: var(--viking-radius-lg, 12px);
737
+ background: var(--viking-surface, var(--card-bg));
738
+ box-shadow: var(--viking-shadow-lg, var(--shadow-md));
739
+ overflow: hidden;
740
+ font-family: var(--viking-font-family, inherit);
741
+ color: var(--viking-text, var(--text-color));
742
+ position: relative;
743
+ }
744
+
745
+ .aa-Autocomplete::before,
746
+ .aa-DetachedContainer::before {
747
+ content: '';
748
+ position: absolute;
749
+ inset: 0 0 auto;
750
+ height: 1px;
751
+ background: linear-gradient(
752
+ 90deg,
753
+ transparent,
754
+ color-mix(in srgb, var(--viking-metallic-200) 22%, transparent),
755
+ transparent
756
+ );
757
+ pointer-events: none;
758
+ z-index: 1;
759
+ }
760
+
761
+ .aa-Form,
762
+ form {
763
+ @include viking-navbar-search-shell;
764
+ margin: 0 !important;
765
+ border: 0 !important;
766
+ border-bottom: 1px solid var(--viking-border, var(--border)) !important;
767
+ border-radius: 0 !important;
768
+ box-shadow: none !important;
769
+ background: color-mix(in srgb, var(--viking-bg, var(--bg-color)) 20%, transparent);
770
+
771
+ &:focus-within {
772
+ border-bottom-color: var(--viking-accent, var(--viking-accent)) !important;
773
+ box-shadow: inset 0 -2px 0 var(--viking-accent-soft, color-mix(in srgb, var(--viking-accent) 12%, transparent)) !important;
774
+ outline: none;
775
+ }
776
+ }
777
+
778
+ .aa-Panel {
779
+ position: static;
780
+ margin: 0;
781
+ border: 0;
782
+ border-radius: 0;
783
+ box-shadow: none;
784
+ background: transparent;
785
+ max-height: 50vh;
786
+ padding: var(--viking-space-2, 16px);
787
+ }
788
+
789
+ &::after {
790
+ content: '⌘K toggle · Esc close';
791
+ display: block;
792
+ max-width: 600px;
793
+ width: 100%;
794
+ margin: 0 auto;
795
+ padding: var(--viking-space-1, 8px) var(--viking-space-2, 16px);
796
+ border: 1px solid var(--viking-border, var(--border));
797
+ border-top: 1px solid var(--viking-border, var(--border));
798
+ border-radius: 0 0 var(--viking-radius-lg, 12px) var(--viking-radius-lg, 12px);
799
+ background: var(--viking-surface, var(--card-bg));
800
+ font-size: calc(var(--viking-font-size, 16px) * 0.85);
801
+ color: var(--viking-text-muted, var(--text-muted));
802
+ text-align: center;
803
+ letter-spacing: 0.01em;
804
+ }
805
+ }
806
+
807
+ .navbar-search-trigger,
808
+ .navbar-search-mobile-btn {
809
+ @include viking-navbar-utility-btn;
810
+ display: inline-flex;
811
+ align-items: center;
812
+ justify-content: center;
813
+ width: var(--viking-control-height, 40px);
814
+ height: var(--viking-control-height, 40px);
815
+ padding: 0;
816
+ flex-shrink: 0;
817
+ align-self: center;
818
+ }
819
+
820
+ .algolia-autocomplete-host .aa-Autocomplete,
821
+ .algolia-autocomplete-host .aa-DetachedContainer {
822
+ width: 100%;
823
+ }
824
+
825
+ .algolia-autocomplete-host .aa-Form,
826
+ .algolia-autocomplete-host form {
827
+ @include viking-navbar-search-shell;
828
+ margin: 0 !important;
829
+
830
+ &:focus-within {
831
+ @include viking-navbar-search-shell-focus;
832
+ }
833
+ }
834
+
835
+ .algolia-autocomplete-host .aa-InputWrapper {
836
+ display: flex;
837
+ align-items: center;
838
+ flex: 1;
839
+ min-width: 0;
840
+ gap: var(--viking-space-1, 8px);
841
+ border: 0 !important;
842
+ box-shadow: none !important;
843
+ background: transparent !important;
844
+ padding: 0 !important;
845
+ }
846
+
847
+ .algolia-autocomplete-host .aa-InputWrapperPrefix,
848
+ .algolia-autocomplete-host .aa-InputWrapperSuffix {
849
+ display: inline-flex;
850
+ align-items: center;
851
+ justify-content: center;
852
+ flex-shrink: 0;
853
+ align-self: center;
854
+ color: var(--viking-accent-strong, var(--viking-ring));
855
+ border: 0 !important;
856
+ box-shadow: none !important;
857
+ background: transparent !important;
858
+ padding: 0 !important;
859
+ line-height: 1;
860
+ }
861
+
862
+ // Hide Algolia default purple branding; prefix uses theme accent at control size.
863
+ .algolia-autocomplete-host .aa-SubmitButton,
864
+ .algolia-autocomplete-host .aa-DetachedSearchButton,
865
+ .algolia-autocomplete-host .aa-Label,
866
+ .algolia-autocomplete-host .aa-PoweredBy {
867
+ display: none !important;
868
+ }
869
+
870
+ .algolia-autocomplete-host .aa-InputWrapperPrefix svg,
871
+ .algolia-autocomplete-host .aa-InputWrapperSuffix svg,
872
+ .algolia-autocomplete-host .aa-InputWrapperPrefix img,
873
+ .algolia-autocomplete-host .aa-InputWrapperSuffix img {
874
+ width: 20px !important;
875
+ height: 20px !important;
876
+ max-width: 20px !important;
877
+ max-height: 20px !important;
878
+ color: var(--viking-accent-strong, var(--viking-ring)) !important;
879
+ fill: currentColor !important;
880
+ stroke: currentColor !important;
881
+ }
882
+
883
+ .algolia-autocomplete-host .aa-Input,
884
+ .algolia-autocomplete-host input {
885
+ flex: 1;
886
+ width: 100%;
887
+ min-width: 0;
888
+ min-height: 0 !important;
889
+ height: auto;
890
+ padding: 0 !important;
891
+ border: 0 !important;
892
+ border-radius: 0 !important;
893
+ outline: none !important;
894
+ background: transparent !important;
895
+ color: var(--viking-text, var(--text-color));
896
+ font: inherit;
897
+ font-size: var(--viking-font-size, 16px);
898
+ line-height: var(--viking-line-height-normal, 1.5);
899
+ box-shadow: none !important;
900
+ }
901
+
902
+ .algolia-autocomplete-host .aa-Input::placeholder,
903
+ .algolia-autocomplete-host input::placeholder {
904
+ color: var(--viking-text-muted, var(--text-muted));
905
+ }
906
+
907
+ .algolia-autocomplete-host .aa-Panel {
908
+ @include viking-navbar-search-panel;
909
+ position: absolute;
910
+ top: calc(100% + var(--viking-space-1, 8px));
911
+ left: 0;
912
+ right: 0;
913
+ z-index: var(--viking-z-overlay, 10001);
914
+ }
915
+
916
+ .algolia-autocomplete-host .aa-PanelLayout,
917
+ .algolia-autocomplete-host .aa-Source {
918
+ margin: 0;
919
+ }
920
+
921
+ .algolia-autocomplete-host .aa-List {
922
+ display: flex;
923
+ flex-direction: column;
924
+ gap: 2px;
925
+ margin: 0;
926
+ padding: 0;
927
+ list-style: none;
928
+ }
929
+
930
+ .algolia-autocomplete-host .aa-SourceHeader {
931
+ display: flex;
932
+ align-items: center;
933
+ gap: var(--viking-space-1, 8px);
934
+ padding: var(--viking-space-1, 8px) var(--viking-space-1, 8px) 0;
935
+ margin: 0;
936
+ }
937
+
938
+ .algolia-autocomplete-host .aa-SourceHeaderTitle {
939
+ font-size: calc(var(--viking-font-size-sm, 14px) * 0.85);
940
+ font-weight: 700;
941
+ text-transform: uppercase;
942
+ letter-spacing: 0.1em;
943
+ color: var(--viking-text-muted, var(--text-muted));
944
+ }
945
+
946
+ .algolia-autocomplete-host .aa-SourceHeaderLine {
947
+ flex: 1;
948
+ height: 1px;
949
+ background: var(--viking-border, var(--border));
950
+ }
951
+
952
+ .algolia-autocomplete-host .aa-Item {
953
+ border-radius: calc(var(--viking-radius, 8px) / 1.5);
954
+ padding: 0;
955
+ margin: 0;
956
+ }
957
+
958
+ .algolia-autocomplete-host .aa-ItemLink,
959
+ .algolia-autocomplete-host .aa-ItemWrapper {
960
+ display: flex;
961
+ align-items: flex-start;
962
+ gap: var(--viking-space-1-5, 12px);
963
+ min-height: var(--viking-control-height-sm, 36px);
964
+ padding: var(--viking-space-1-5, 12px);
965
+ border-radius: calc(var(--viking-radius, 8px) / 1.5);
966
+ color: var(--viking-text, var(--text-color));
967
+ text-decoration: none;
968
+ transition: var(--viking-transition-interactive, background-color 0.2s ease);
969
+ }
970
+
971
+ .algolia-autocomplete-host .aa-Item[aria-selected='true'] .aa-ItemLink,
972
+ .algolia-autocomplete-host .aa-Item[aria-selected='true'] .aa-ItemWrapper,
973
+ .algolia-autocomplete-host .aa-Item:hover .aa-ItemLink,
974
+ .algolia-autocomplete-host .aa-Item:hover .aa-ItemWrapper {
975
+ background: var(--viking-accent-soft, color-mix(in srgb, var(--viking-accent) 12%, transparent));
976
+ }
977
+
978
+ .algolia-autocomplete-host .aa-ItemContent {
979
+ display: flex;
980
+ align-items: flex-start;
981
+ gap: var(--viking-space-1-5, 12px);
982
+ min-width: 0;
983
+ flex: 1;
984
+ }
985
+
986
+ .algolia-autocomplete-host .aa-ItemIcon {
987
+ display: inline-flex;
988
+ align-items: center;
989
+ justify-content: center;
990
+ flex-shrink: 0;
991
+ width: var(--viking-space-5, 40px);
992
+ height: var(--viking-space-5, 40px);
993
+ margin-top: 2px;
994
+ border-radius: var(--viking-radius, 8px);
995
+ background: var(--viking-surface-alt, var(--viking-charcoal-700)) !important;
996
+ box-shadow: none !important;
997
+ color: var(--viking-accent-strong, var(--viking-ring));
998
+ overflow: hidden;
999
+
1000
+ img,
1001
+ svg {
1002
+ width: 20px;
1003
+ height: 20px;
1004
+ object-fit: contain;
1005
+ }
1006
+ }
1007
+
1008
+ .algolia-autocomplete-host .aa-Item[aria-selected='true'] .aa-ItemIcon,
1009
+ .algolia-autocomplete-host .aa-Item:hover .aa-ItemIcon {
1010
+ color: var(--viking-accent, var(--viking-accent));
1011
+ }
1012
+
1013
+ .algolia-autocomplete-host .aa-ItemContentBody {
1014
+ display: flex;
1015
+ flex-direction: column;
1016
+ gap: calc(var(--viking-space-1, 8px) / 2);
1017
+ min-width: 0;
1018
+ flex: 1;
1019
+ }
1020
+
1021
+ .algolia-autocomplete-host .aa-ItemContentTitle {
1022
+ font-size: var(--viking-font-size, 16px);
1023
+ font-weight: 600;
1024
+ color: var(--viking-text, var(--text-color));
1025
+ line-height: 1.3;
1026
+ }
1027
+
1028
+ .algolia-autocomplete-host .aa-ItemContentDescription {
1029
+ font-size: var(--viking-font-size-sm, 14px);
1030
+ color: var(--viking-text-muted, var(--text-muted));
1031
+ line-height: var(--viking-line-height-relaxed, 1.625);
1032
+ white-space: normal;
1033
+ overflow: hidden;
1034
+ display: -webkit-box;
1035
+ -webkit-box-orient: vertical;
1036
+ -webkit-line-clamp: 3;
1037
+ text-overflow: ellipsis;
1038
+ }
1039
+
1040
+ .algolia-autocomplete-host mark,
1041
+ .algolia-autocomplete-host .aa-ItemContentTitle mark,
1042
+ .algolia-autocomplete-host .aa-ItemContentDescription mark {
1043
+ background: color-mix(in srgb, var(--viking-accent, var(--viking-accent)) 20%, transparent);
1044
+ color: var(--viking-accent, var(--viking-accent));
1045
+ border-radius: 0;
1046
+ padding: 0;
1047
+ font-weight: 600;
1048
+ }
1049
+
1050
+ .algolia-autocomplete-host .aa-ItemActions,
1051
+ .algolia-autocomplete-host .aa-GradientBottom,
1052
+ .algolia-autocomplete-host .aa-GradientTop {
1053
+ display: none;
1054
+ }
1055
+
1056
+ // Detached overlay (Algolia mobile / portal panel) — match search-palette modal.
1057
+ .aa-DetachedOverlay {
1058
+ background: var(--viking-overlay-backdrop, rgba(0, 0, 0, 0.55)) !important;
1059
+ backdrop-filter: blur(4px);
1060
+ -webkit-backdrop-filter: blur(4px);
1061
+ }
1062
+
1063
+ .aa-DetachedContainer {
1064
+ font-family: var(--viking-font-family, inherit);
1065
+ border: 1px solid var(--viking-border, var(--border)) !important;
1066
+ border-radius: var(--viking-radius-lg, 12px) !important;
1067
+ background: var(--viking-surface, var(--card-bg)) !important;
1068
+ box-shadow: var(--viking-shadow-lg, var(--shadow-md)) !important;
1069
+ }
1070
+
1071
+ .aa-DetachedContainer .aa-Form,
1072
+ .aa-DetachedContainer form {
1073
+ @include viking-navbar-search-shell;
1074
+ margin: var(--viking-space-1, 8px) !important;
1075
+ border-bottom: 1px solid var(--viking-border, var(--border)) !important;
1076
+ border-radius: var(--viking-radius, 8px) var(--viking-radius, 8px) 0 0 !important;
1077
+ box-shadow: none !important;
1078
+ }
1079
+
1080
+ .aa-DetachedContainer .aa-Panel {
1081
+ @include viking-navbar-search-panel;
1082
+ position: static !important;
1083
+ border: 0 !important;
1084
+ box-shadow: none !important;
1085
+ max-height: 50vh !important;
1086
+ }
1087
+
444
1088
  @media (min-width: 768px) {
1089
+ .navbar-content {
1090
+ position: relative;
1091
+ }
1092
+
1093
+ .navbar-center.desktop-nav {
1094
+ position: absolute;
1095
+ left: 50%;
1096
+ transform: translateX(-50%);
1097
+ z-index: 1;
1098
+ pointer-events: auto;
1099
+ max-width: min(100% - 22rem, 42rem);
1100
+ overflow: hidden;
1101
+ justify-content: center;
1102
+ }
1103
+
1104
+ .navbar-left {
1105
+ position: relative;
1106
+ z-index: 2;
1107
+ flex-shrink: 0;
1108
+ }
1109
+
1110
+ .navbar-right {
1111
+ position: relative;
1112
+ z-index: 2;
1113
+ flex-shrink: 0;
1114
+ min-width: 12.5rem;
1115
+ pointer-events: none;
1116
+
1117
+ > * {
1118
+ pointer-events: auto;
1119
+ }
1120
+ }
1121
+
445
1122
  .desktop-nav {
446
1123
  display: flex;
447
1124
  }
@@ -450,11 +1127,50 @@ html[data-theme='light'] {
450
1127
  display: flex;
451
1128
  }
452
1129
 
453
- .menu-toggle-btn {
1130
+ .menu-toggle-btn,
1131
+ viking-button.menu-toggle-btn {
454
1132
  display: none !important;
455
1133
  }
456
1134
 
457
- .mobile-menu {
1135
+ .mobile-menu:not(.open) {
458
1136
  display: none !important;
459
1137
  }
1138
+
1139
+ .navbar-right {
1140
+ gap: var(--viking-space-2, 16px);
1141
+ }
1142
+
1143
+ .desktop-nav {
1144
+ gap: var(--viking-space-1, 8px);
1145
+ }
1146
+ }
1147
+
1148
+ // Compact desktop — icon-only nav labels when the bar is still tight.
1149
+ @container viking-navbar (min-width: 880px) and (max-width: 1120px) {
1150
+ .nav-btn {
1151
+ padding: 0 var(--viking-space-1, 8px) !important;
1152
+ gap: 0 !important;
1153
+ }
1154
+
1155
+ .nav-btn > span {
1156
+ position: absolute;
1157
+ width: 1px;
1158
+ height: 1px;
1159
+ padding: 0;
1160
+ margin: -1px;
1161
+ overflow: hidden;
1162
+ clip: rect(0, 0, 0, 0);
1163
+ white-space: nowrap;
1164
+ border: 0;
1165
+ }
1166
+ }
1167
+
1168
+ // Full desktop — restore nav link labels and spacing.
1169
+ @container viking-navbar (min-width: 1121px) {
1170
+ .nav-btn {
1171
+ padding: 0 var(--viking-space-2, 16px) !important;
1172
+ gap: 8px !important;
1173
+ font-size: var(--viking-font-size, 16px) !important;
1174
+ letter-spacing: 0.08em !important;
1175
+ }
460
1176
  }