[FIX] viin_backend_theme: restyle core without rewriting it
A theme may change how Odoo looks. This one had begun changing what Odoo
says, what it does, and how it describes itself to assistive technology -
and runbot batch 223955 was where that came due.
The theme case-transformed two surfaces it does not own: core's
command-palette category block and the list view's column headers. Rendered
text is what Odoo's own automated checks, tour assertions, screen readers
and a user's copy-paste all read back, so a purely cosmetic rule turned 102
core checks red at once ("Command#" read back as "COMMAND#"). Core already
presents the palette's category label in capitals itself, so ours added
nothing. It was also a defect users could see: the class it targeted is the
block holding every command row, not the label, so its muted colour, 11px
size, weight and letter-spacing were inherited by every row in the palette.
Aiming the rule at the label alone restores the rows to core's typography.
Odoo ends every font stack it ships with two safety nets: a small Noto
subset for characters a system font lacks or renders badly, and the four
emoji families. This theme replaced Odoo's stacks with its own and dropped
both nets from headings and from body text, so an emoji or an uncommon
script in ordinary backend text - a customer name, a chatter message, a
product label - could land on a system with nothing able to draw it and
render as an empty box. Both stacks are whole again and now end identically.
The brand heading font was also reaching into the rich-text editor, where an
outgoing email body inlines whatever font it is shown in, handing the
recipient a Viindoo face their mail client does not have and which is not
even vendored yet. Email bodies go back to the portable system stack; the
backend keeps Montserrat.
Clicking the navbar apps icon threw away whatever the user was working on.
The icon opened the home menu as a full page, so an open record, a half
filled form or a kanban the user had just filtered was torn down and had to
be rebuilt on the way back. Odoo's own contract for that icon is that it
shows the app list without navigating, and a large part of Odoo's test suite
is written on that assumption: 57 test files click it, some to pick an app,
others merely in passing before carrying on with the screen they were
already on. The latter could not work here at all, and the former could not
either, because our tiles were not the kind of element those tests look for.
The icon now shows the same full-screen home menu over the untouched view.
Pressing it again puts it away and the user is back where they were -
instantly, because nothing was ever destroyed - and so does clicking the
page behind it or pressing Escape, which the full-page version offered no
way to do. The design is unchanged: one icon, one home menu, and the landing
page shown at sign-in is untouched.
App tiles are now real links, as they are in stock Odoo, so they can be
opened in a new tab, copied, or announced sensibly. They had carried an
explicit role telling a screen reader each tile is an item in a list, never
that it is something the user can follow; because an explicit role replaces
an element's own rather than adding to it, the tiles were also absent from
links navigation, one of the main ways people using a screen reader move
through a page. That role is gone, and the grid's own list role went with
it, since a list is required to contain list items and keeping one alone
would have left an empty, malformed list rather than a fix. Wrapping each
tile to keep both was rejected: the tiles are laid out directly by the grid
and are the elements the drag-to-reorder handles, so a wrapper breaks the
layout and the reordering unless hidden by a CSS trick with its own record
of removing elements from the accessibility tree. Nothing on screen changes,
and keyboard navigation and drag-to-reorder are unaffected.
Guards now fail the build if this theme case-transforms anything it did not
author, if either font stack loses its fallback, or if a tile stops being
announced as a link; the font guard reads the value the browser is actually
handed rather than the source. One existing check was inverted rather than
weakened: it asserted the previous view was gone after clicking the apps
icon, which is the behaviour being fixed, and now asserts the view survives.
Owner decisions D1, D2 and D3, 2026-08-17.
Signed-off-by: David Tran <david.tran@tvtmarine.com>
| Subbuilds | Name | State | Detail |
|---|---|---|---|
| Build 404948 | Check the quality with Pylint: from test_lint to test_pylint 17m | Succeed | Log |
| Build 404949 | At install tests: from account to website_timesheet 66m | Succeed | Log |
| Build 404950 | Post install tests: step install all modules 12m | Succeed | Log |
| Build 404951 | Post install tests: from account to hr_recruitment_survey 70m | Succeed | Log |
| Build 404952 | Post install tests: from hr_skills to phone_validation 40m | Succeed | Log |
| Build 404953 | Post install tests: from point_of_sale to purchase_requisition_stock 124m | Succeed | Log |
| Build 404954 | Post install tests: from purchase_stock to test_lint 65m | Succeed | Log |
| Build 404955 | Post install tests: from test_mail to to_product_odoo_version 39m | Succeed | Log |
| Build 404956 | Post install tests: from to_sshkey to viin_account 10m | Succeed | Log |
| Build 404957 | Post install tests: from viin_backend_theme to viin_maintenance_preventive_mode 10m | Succeed | Log |
| Build 404958 | Post install tests: from web to web_unsplash 70m | Succeed | Log |
| Build 404959 | Post install tests: from website to website_timesheet 79m | Succeed | Log |
| Build 404960 | Test install all modules without demo data: from account to website_timesheet 6m | Succeed | Log |
| Create Date | Level | Message |
|---|---|---|
| 08/18/2026 08:50:32 | INFO |
Updated repository Viindoo-odoo
|
| 08/18/2026 08:50:32 | INFO |
Updated repository Viindoo-tvtmaaddons
|
| 08/18/2026 08:50:32 | INFO |
Cloned repository Viindoo-branding
|