Skip to content

Commit 33f1b1a

Browse files
committed
style: UI improvement to match existing _field_dropdown.html
1 parent 00b00ea commit 33f1b1a

3 files changed

Lines changed: 72 additions & 48 deletions

File tree

static/css/v3/header.css

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -313,45 +313,66 @@ html.dark .header__icon--theme-moon {
313313
}
314314

315315
.header__version-dropdown {
316+
--dropdown-item-height: 40px;
317+
316318
display: none;
317319
position: absolute;
318320
top: calc(100% + var(--space-s));
319321
right: 0;
320322
flex-direction: column;
321323
width: max-content;
322324
min-width: 100%;
323-
max-height: 60vh;
325+
max-height: calc(var(--dropdown-item-height) * 7); /* Show up to 7 items, then scroll */
324326
overflow-y: auto;
325-
padding: var(--space-default) var(--space-medium);
326-
gap: var(--space-s);
327327
border-radius: var(--header-radius);
328-
border: 1px solid var(--color-stroke-mid);
328+
border: 1px solid var(--color-stroke-weak);
329329
background: var(--color-surface-weak);
330+
scrollbar-width: thin;
331+
scrollbar-color: var(--color-icon-primary) var(--color-surface-strong);
330332
z-index: 1000;
331333
}
332334

333-
.header__version-dropdown .header__nav-link {
334-
padding: 0 var(--space-s);
335+
.header__version-dropdown .header__version-option {
336+
display: flex;
337+
align-items: center;
338+
flex-shrink: 0;
335339
width: 100%;
336-
}
337-
338-
/* Forms wrap individual options; `display: contents` lets the inner button
339-
inherit the dropdown's flex layout directly. */
340-
.header__version-form {
341-
display: contents;
342-
}
343-
344-
.header__version-dropdown button.header__nav-link {
340+
height: var(--dropdown-item-height);
341+
padding: 0 var(--space-large);
345342
border: none;
343+
border-radius: 0;
346344
background: transparent;
347-
font: inherit;
348-
color: inherit;
345+
font-family: var(--font-sans);
346+
font-size: var(--font-size-small);
347+
font-weight: var(--font-weight-regular);
348+
line-height: var(--line-height-relaxed);
349+
color: var(--color-text-secondary);
349350
text-align: left;
351+
text-decoration: none;
350352
cursor: pointer;
353+
transition: background-color 0.1s ease, color 0.1s ease;
354+
}
355+
356+
.header__version-dropdown .header__version-option + .header__version-option {
357+
border-top: 1px solid var(--color-stroke-subtle);
358+
}
359+
360+
.header__version-dropdown .header__version-option:hover,
361+
.header__version-dropdown .header__version-option:focus {
362+
background-color: var(--color-surface-mid);
363+
color: var(--color-text-link-accent);
364+
outline: none;
365+
}
366+
367+
.header__version-dropdown .header__version-option:focus-visible {
368+
outline: 2px solid var(--color-text-link-accent);
369+
outline-offset: -2px;
351370
}
352371

353372
.header__version-option[aria-current="true"] {
354-
font-weight: var(--font-weight-bold);
373+
color: var(--color-text-primary);
374+
font-weight: var(--font-weight-medium);
375+
text-decoration: underline;
355376
}
356377

357378
/* ── User menu & avatar ────────────────────────── */

templates/v3/includes/_header_v3.html

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,17 @@
148148
document.addEventListener('submit', function (e) {
149149
var form = e.target;
150150
if (!form.matches || !form.matches('.header__version-form')) return;
151+
152+
// The clicked option button carries name="version" value="<slug>".
153+
// FormData(form) doesn't include the submitter's name/value, so append it.
154+
var submitter = e.submitter;
155+
if (!submitter || submitter.name !== 'version') return;
151156
e.preventDefault();
152157

158+
var selectedValue = submitter.value;
159+
var newLabel = submitter.textContent.trim();
153160
var formData = new FormData(form);
154-
var submitBtn = form.querySelector('button[type="submit"]');
155-
var newLabel = submitBtn ? submitBtn.textContent.trim() : '';
156-
var selectedValue = formData.get('version');
161+
formData.set('version', selectedValue);
157162

158163
fetch(form.action, {
159164
method: 'POST',
@@ -170,9 +175,7 @@
170175
if (label) label.textContent = newLabel;
171176

172177
menu.querySelectorAll('.header__version-option').forEach(function (opt) {
173-
var optForm = opt.closest('.header__version-form');
174-
var optInput = optForm && optForm.querySelector('input[name="version"]');
175-
if (optInput && optInput.value === selectedValue) {
178+
if (opt.value === selectedValue) {
176179
opt.setAttribute('aria-current', 'true');
177180
} else {
178181
opt.removeAttribute('aria-current');

templates/v3/includes/header/_header_version_dropdown.html

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,52 +26,52 @@
2626
class="header__version-toggle"
2727
aria-label="Select Boost version"
2828
aria-controls="{{ version_menu_id }}-dropdown">
29-
<label for="{{ version_menu_id }}-toggle" class="header__version-trigger" aria-hidden="true">
29+
<label for="{{ version_menu_id }}-toggle"
30+
class="header__version-trigger"
31+
aria-hidden="true">
3032
<span class="header__version-label">{{ selected_version_label }}</span>
3133
<span class="icon-brand-accent">
3234
{% include "includes/icon.html" with icon_name="chevron-down" icon_class="header__icon header__icon--chevron" icon_size=16 %}
3335
</span>
3436
</label>
35-
<div id="{{ version_menu_id }}-dropdown" role="group" class="header__version-dropdown">
37+
<div id="{{ version_menu_id }}-dropdown"
38+
role="group"
39+
class="header__version-dropdown">
3640
{% if selected_version_is_url_driven %}
3741
{% if latest_href %}
3842
<a href="{{ latest_href }}"
39-
class="header__nav-link header__version-option"
40-
{% if not selected_version_is_non_latest %}aria-current="true"{% endif %}>
41-
Latest
42-
</a>
43+
class="header__version-option"
44+
{% if not selected_version_is_non_latest %}aria-current="true"{% endif %}>Latest</a>
4345
{% endif %}
4446
{% for v in version_dropdown_options %}
4547
{% if v.href %}
4648
<a href="{{ v.href }}"
47-
class="header__nav-link header__version-option"
48-
{% if selected_version and v.slug == selected_version.slug %}aria-current="true"{% endif %}>
49+
class="header__version-option"
50+
{% if selected_version_is_non_latest and selected_version and v.slug == selected_version.slug %}aria-current="true"{% endif %}>
4951
{{ v.display_name }}
5052
</a>
5153
{% endif %}
5254
{% endfor %}
53-
5455
{% else %}
55-
<form method="post" action="{% url 'set-version' %}" class="header__version-form">
56+
<form method="post"
57+
action="{% url 'set-version' %}"
58+
class="header__version-form">
5659
{% csrf_token %}
57-
<input type="hidden" name="version" value="latest">
5860
<button type="submit"
59-
class="header__nav-link header__version-option"
60-
{% if not selected_version_is_non_latest %}aria-current="true"{% endif %}>
61-
Latest
62-
</button>
63-
</form>
64-
{% for v in version_dropdown_options %}
65-
<form method="post" action="{% url 'set-version' %}" class="header__version-form">
66-
{% csrf_token %}
67-
<input type="hidden" name="version" value="{{ v.slug }}">
61+
name="version"
62+
value="latest"
63+
class="header__version-option"
64+
{% if not selected_version_is_non_latest %}aria-current="true"{% endif %}>Latest</button>
65+
{% for v in version_dropdown_options %}
6866
<button type="submit"
69-
class="header__nav-link header__version-option"
70-
{% if selected_version and v.slug == selected_version.slug %}aria-current="true"{% endif %}>
67+
name="version"
68+
value="{{ v.slug }}"
69+
class="header__version-option"
70+
{% if selected_version_is_non_latest and selected_version and v.slug == selected_version.slug %}aria-current="true"{% endif %}>
7171
{{ v.display_name }}
7272
</button>
73-
</form>
74-
{% endfor %}
73+
{% endfor %}
74+
</form>
7575
{% endif %}
7676
</div>
7777
</div>

0 commit comments

Comments
 (0)