---
title: "Important: The profile editor draws its own focus ring"
manual: "Academic Profiles Edit"
version: "main"
source: "Changelog/3.0/Important-ProfileEditingOwnsTheFocusRing.rst"
rendered: "2026-09-30T20:17:10+00:00"
---

# Important: The profile editor draws its own focus ring {#important-profile-editing-owns-the-focus-ring}

## Description {#description}

The [Profile editing](../../ProfileEditing/Index.html#profile-editing) view now styles the focus of the controls and the
buttons it renders, and no longer leaves that to the surrounding theme.

Bootstrap draws a focused control's ring with `box-shadow`, and a theme is
free to layer more rings behind Bootstrap's. `bk2k/bootstrap-package` does: it
adds an opaque white ring and an opaque black one behind the translucent accent
ring, on `:focus-visible` of `.form-control`, `.form-select`,
`.form-check-input` and `.btn`. Shadows paint in the order they are
written, so the black ring covers the full width and the white one only its
inner half, and a translucent accent ring over an opaque black one is dark: the
outer half of the ring reads as a hard black rectangle tight around the
control. Rendered and read back pixel by pixel, that band is `#161e18` on the
theme's light body background.

Two more things were wrong with drawing a focus ring as a shadow, and the view
now avoids all three at once by drawing a real `outline` instead.

A shadow is painted outside the border box, so an ancestor with
`overflow: hidden` cuts it away. The document editor's collapse panel and the
image editor are exactly that, the grid row inside them pulls itself out to the
clipping edge, and every field and every button of those panels therefore sat
with its left and its right border edge on that edge. Measured before this
change, a focused field of a document panel and the file input of the image
editor - which the image editor focuses on every open - showed no ring pixel at
all on either side, only Bootstrap's `#abbbb0` border at about 2:1 against
white.

And forced-colours mode drops `box-shadow` altogether, while the rules that
draw a ring that way also set `outline: 0`. What a user of a high contrast
theme then saw was not the site's focus indicator but whatever the browser put
in its place, which differs between browsers. An `outline` is kept and
recoloured in every one of them.

The ring is therefore drawn as an `outline` on `:focus-visible`, inside the
border box so that no ancestor can clip it, and `box-shadow: none` in the
same rule takes the layered rings and the theme's inset shadow off with it.
`:focus-visible` rather than `:focus` is what the theme's own rules use and
what Bootstrap uses for buttons, so it is exactly where the defect is.

`:focus-visible` is not the same thing as keyboard focus, and the difference
decides what a visitor using a mouse sees. Measured in Chrome, a pointer click
on a checkbox or on the synchronisation switch does *not* match it, so those
two keep the soft glow Bootstrap has always drawn for them. A pointer click on
a text input or a select *does* match it, so those lose the glow and take the
inset ring instead. Four of the five controls of
`Partials/Profile/Field/Control.html` \- the text field, the two
textareas and the select - therefore look different on a plain mouse click
than they did before, and so do the file input of the image editor and the
controls of the document and contract editors. **The majority of the editor's
controls change their appearance on a mouse click, not only under the
keyboard.** Buttons are the exception in the other direction: the theme's rule
for `.btn` was already `:focus-visible`, so what changes for a button is
the shape of the ring and not when it appears.

Its colour is `currentcolor`, the colour the control draws its own text in.
That contrasts with the control by construction and in every colour mode,
which no fixed colour and no Bootstrap custom property does -
`--bs-primary-text-emphasis` is dark by design and measures 1.6:1 against the
green of a focused `.btn-success`.

`.form-check-input` is the one control that reasoning does not cover, and it
is worth stating rather than glossing over. Bootstrap draws the tick of a
checkbox and the knob of a switch as a background image with a hardcoded
`#ffffff` fill, not in `currentcolor`, so the ring on those two takes the
inherited body colour instead of the colour of the mark. With the shipped
theme that is `#212121` on the `#577760` of a checked control, which
measures 3.23:1 - above the 3:1 WCAG 2.1 SC 1.4.11 asks of a focus indicator,
but with nothing to spare. A site whose `$primary` is darker than the
theme's falls below it, and should either lighten the control or override the
`outline-color` of `.form-check-input` in the view.

The rule reaches every `input`, `select`, `textarea` and `button` of
the view: the five controls of `Partials/Profile/Field/Control.html`, the
image upload of `Partials/Profile/Image/Editor.html`, the synchronisation
switch of `Partials/Profile/Header.html` and the buttons of every action
group. Plain links are deliberately not covered - no theme rule takes their
focus ring away. CKEditor 5 is covered by halves: its editable region is a
`div` and keeps the library's own focus styling, while the buttons of its
toolbar are `button` elements below the plugin root and take this ring
instead.

## Impact {#impact}

A site that did nothing about the focus appearance gets one clearly visible
ring on every control and every button of the view, in both colour modes, and
gets it in the panels where the previous appearance was cut away.

Check it with the mouse, not only with the keyboard. Most of the controls the
view renders match `:focus-visible` on a plain pointer click, so the new ring
replaces Bootstrap's glow for a visitor who never touches the tab key; only the
checkbox and the synchronisation switch keep the appearance they had.

A site that styled the focus of the editor's controls itself has to check that
its rule still wins. The shipped rule carries the plugin root three times
against the theme's compat layer, which puts it at four class selectors and a
tag name; a project rule that matched two class selectors now loses to it.
Adding the plugin root to the project's own selector, or an `!important`,
restores the project's appearance.

## Affected Installations {#affected-installations}

Installations of the **Profile editing** content element of
`EXT:academic_persons_edit` whose site styles the focus of its form controls or
buttons, or whose theme relied on styling them.
