Choices in Basecoat's select: a flag beside a language or a country, an icon beside a kind, time zones grouped by continent #301
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#301
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
From the interface review of 2026-09-29. The rule asked for: a select is Basecoat's select unless a page says otherwise, and the places where the list itself should show more than words:
What is there today
native-select: every<select>is the browser's own, painted. It works with scripts off and with every assistive technology, and on a phone it opens the platform's own picker.<option>holds text and nothing else, which is why #88 and #208 put the flag beside the closed select ({% language_flag %},{% flag %},data-flag-holder), drawn by the server and kept in step byapp.js. In the open list there is no flag, and there is no icon anywhere.accounts/forms.py::time_zone_choicesis one list of every IANA name, sorted: some four hundred entries.What Basecoat's select is
select.csswithselect.js: a<button>showing the choice, a popover holding arole="listbox", a hidden<input>carrying the value, and a filter box for a long list. Its options are elements, so a flag or an icon can sit in them.It does nothing without its script: the button opens nothing and the form posts no value. Every page here works with scripts off, so the server draws the native
<select>and the script replaces it with Basecoat's markup, carrying across the value,required,disabled, the label'sfor,aria-describedbyand the errors, with the form posting the same name either way.Decisions to take
select.js, or writing it intoapp.js. The project did not vendor Basecoat's dropdown-menu script, because it needed a<button>trigger and hid the panel until it ran. The same test applies here.TRADEMARKS.mdsays what the project does with other people's marks. Proposal: a generic icon per kind, and a brand mark only where its owner's terms allow it.<optgroup>by the part of the IANA name before the slash (Africa, America, Antarctica, Asia, Atlantic, Australia, Europe, Indian, Pacific, andEtcfor the rest) works in the native select today, and Basecoat's select has groups too.Done when
tests/test_template_lint.pyholds whatever rule (1) decides.CONTRIBUTING.mdand the wiki's Design page say when a select is Basecoat's.Decided (2026-09-29): everywhere, as the review asked, not only where the options carry a flag or an icon. The server still draws the native
<select>as the scripts-off path, and the script replaces it with Basecoat's. So decision 1 is settled;tests/test_template_lint.pyholds the rule that a select is Basecoat's.The maintainer's list of 2026-10-02 adds a requirement that bears on this issue: most select fields do not respect the dark theme.
Two new issues link here. #655 records what the stylesheet does today: the themed option list covers only
.field > selectandselect.select(src/postulo/static/css/app.css:3022-3039), so native selects outside.field >leave the open list to the browser. It keeps the native select as the scripts-off path, as decided on 2026-09-29, so it stays true after this issue lands. #654 takes up brand icons (Simple Icons); its decision 3 is the one this issue still has open.The acceptance should therefore read: axe is clean in both themes, including selects outside
.field.From the list of improvements of 2026-10-02.