@@ -164,19 +164,28 @@ export class KeyboardNavigation {
164164 //
165165 // This should be moved to core, being integrated into the
166166 // existing styling of renderers in core/renderers/*/constants.ts.
167+ //
168+ // Many selectors include .blocklyKeyboardNavigation to ensure keyboard
169+ // nav is on (via the heuristic). This class is added/removed from body.
167170 Blockly . Css . register ( `
168- /* Blocks, connections and fields. */
171+ /* Active focus cases: */
172+ /* Blocks with active focus. */
169173 .blocklyKeyboardNavigation
170174 .blocklyActiveFocus:is(.blocklyPath, .blocklyHighlightedConnectionPath),
175+ /* Fields with active focus, */
171176 .blocklyKeyboardNavigation
172177 .blocklyActiveFocus.blocklyField
173178 > .blocklyFieldRect,
179+ /* Icons with active focus. */
174180 .blocklyKeyboardNavigation
175181 .blocklyActiveFocus.blocklyIconGroup
176182 > .blocklyIconShape:first-child {
177183 stroke: var(--blockly-active-node-color);
178184 stroke-width: var(--blockly-selection-width);
179185 }
186+
187+ /* Passive focus cases: */
188+ /* Blocks with passive focus except when widget/dropdown div in use. */
180189 .blocklyKeyboardNavigation:not(
181190 :has(
182191 .blocklyDropDownDiv > .blocklyDropDownContent > *,
@@ -187,6 +196,7 @@ export class KeyboardNavigation {
187196 .blocklyPath:not(.blocklyFlyout .blocklyPath),
188197 .blocklyHighlightedConnectionPath
189198 ),
199+ /* Fields with passive focus except when widget/dropdown div in use. */
190200 .blocklyKeyboardNavigation:not(
191201 :has(
192202 .blocklyDropDownDiv > .blocklyDropDownContent > *,
@@ -195,6 +205,7 @@ export class KeyboardNavigation {
195205 )
196206 .blocklyPassiveFocus.blocklyField
197207 > .blocklyFieldRect,
208+ /* Icons with passive focus except when widget/dropdown div in use. */
198209 .blocklyKeyboardNavigation:not(
199210 :has(
200211 .blocklyDropDownDiv > .blocklyDropDownContent > *,
@@ -207,9 +218,10 @@ export class KeyboardNavigation {
207218 stroke-dasharray: 5px 3px;
208219 stroke-width: var(--blockly-selection-width);
209220 }
221+
222+ /* Workaround for unexpectedly hidden connection path due to core style. */
210223 .blocklyKeyboardNavigation
211224 .blocklyPassiveFocus.blocklyHighlightedConnectionPath {
212- /* The connection path is being unexpectedly hidden in core */
213225 display: unset !important;
214226 }
215227` ) ;
@@ -219,14 +231,20 @@ export class KeyboardNavigation {
219231 // This should be moved to core, to core/css.ts if not to somewhere
220232 // more specific in core/toolbox/.
221233 Blockly . Css . register ( `
234+ /* Different ways for toolbox/flyout to be the active tree: */
235+ /* Active focus in the flyout. */
222236 .blocklyKeyboardNavigation .blocklyFlyout:has(.blocklyActiveFocus),
237+ /* Active focus in the toolbox. */
223238 .blocklyKeyboardNavigation .blocklyToolbox:has(.blocklyActiveFocus),
239+ /* Active focus on the toolbox/flyout. */
224240 .blocklyKeyboardNavigation
225241 .blocklyActiveFocus:is(.blocklyFlyout, .blocklyToolbox) {
226242 outline-offset: calc(var(--blockly-selection-width) * -1);
227243 outline: var(--blockly-selection-width) solid
228244 var(--blockly-active-tree-color);
229245 }
246+
247+ /* Suppress default outline. */
230248 .blocklyKeyboardNavigation
231249 .blocklyToolboxCategoryContainer:focus-visible {
232250 outline: none;
@@ -237,29 +255,34 @@ export class KeyboardNavigation {
237255 //
238256 // This should be move to core, probably to core/css.ts.
239257 Blockly . Css . register ( `
258+ /* Different ways for the workspace to be the active tree: */
259+ /* Active focus within workspace. */
240260 .blocklyKeyboardNavigation
241261 .blocklyWorkspace:has(.blocklyActiveFocus)
242262 .blocklyWorkspaceFocusRing,
263+ /* Active focus within drag layer. */
243264 .blocklyKeyboardNavigation
244265 .blocklySvg:has(~ .blocklyBlockDragSurface .blocklyActiveFocus)
245266 .blocklyWorkspaceFocusRing,
267+ /* Active focus on workspace. */
246268 .blocklyKeyboardNavigation
247269 .blocklyWorkspace.blocklyActiveFocus
248270 .blocklyWorkspaceFocusRing,
249- .blocklyKeyboardNavigation
250- .blocklyWorkspace.blocklyActiveFocus
251- .blocklyWorkspaceFocusRing,
271+ /* Focus in dropdown div considered to be in workspace. */
252272 .blocklyKeyboardNavigation:has(
253273 .blocklyDropDownDiv > .blocklyDropDownContent > *
254274 ):focus-within
255275 .blocklyWorkspace
256276 .blocklyWorkspaceFocusRing,
277+ /* Focus in widget div considered to be in workspace. */
257278 .blocklyKeyboardNavigation:has(.blocklyWidgetDiv > *):focus-within
258279 .blocklyWorkspace
259280 .blocklyWorkspaceFocusRing {
260281 stroke: var(--blockly-active-tree-color);
261282 stroke-width: calc(var(--blockly-selection-width) * 2);
262283 }
284+
285+ /* The workspace itself is the active node. */
263286 .blocklyKeyboardNavigation
264287 .blocklyWorkspace.blocklyActiveFocus
265288 .blocklyWorkspaceSelectionRing {
0 commit comments