fix(soma/menubar): getOrderedValues en orden DOM, no de inserción del Map (#6)

El barrido de calidad de palabras confirmó que el foco por flechas (ArrowLeft/Right,
Home/End) y el hover-slide divergían del orden visual tras navegar a un elemento con
más secciones contextuales: el `{#each}` keyeado reutiliza los triggers persistentes
y los nuevos se APPENDEAN al Map después, así que el orden de inserción ≠ orden DOM.
Ahora getOrderedValues ordena por compareDocumentPosition (query estructural,
reflow-safe), corrigiendo navigateAdjacent/focusEdge/onContentKeydown/hover-slide en
un punto. 5/5 tests del menubar verdes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
alpha-0.1-sec-dom
dev 3 months ago
parent 2c175c5d95
commit 92d060a4fb

@ -100,12 +100,18 @@ export class MenubarProvider {
this.menuProviders.delete(value);
}
/** Menus ordered by trigger registration (DOM order). */
/** Menus in true DOM order (not Map insertion order). Contextual menus can mount
* out of registration order — a keyed `{#each}` reuses persisting triggers while
* new siblings append to the Map after them — so insertion order diverges from the
* visual order that arrow-nav / Home-End / hover-slide must follow. Sort by
* `compareDocumentPosition` (a structural query, reflow-safe). */
getOrderedValues(): string[] {
return [...this.triggerRegistry.keys()].filter((v) => {
const el = this.triggerRegistry.get(v);
return el && !el.hasAttribute('data-disabled');
});
return [...this.triggerRegistry.entries()]
.filter(([, el]) => el && !el.hasAttribute('data-disabled'))
.sort(([, a], [, b]) =>
a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1
)
.map(([v]) => v);
}
/** Open a menu by value; fires onOpenChange for the newly opened and previously open menus. */

Loading…
Cancel
Save

Powered by TurnKey Linux.