Controller returned by createSubmenus.

interface SubmenuController {
    close: (depth: number, restoreFocus?: boolean) => void;
    depthOf: (el: Element) => number;
    layers: readonly SubmenuLayer[];
    open: (trigger: HTMLElement, focus?: "first" | "last" | "none") => boolean;
    prepare: (scope: HTMLElement) => void;
}

Properties

close: (depth: number, restoreFocus?: boolean) => void

Close the submenus from depth outward (0 closes everything).

depthOf: (el: Element) => number

How many submenus deep el sits (0 inside the top-level surface).

layers: readonly SubmenuLayer[]

The open layers, outermost first.

open: (trigger: HTMLElement, focus?: "first" | "last" | "none") => boolean

Open trigger's submenu, closing any branch that isn't an ancestor of it.

prepare: (scope: HTMLElement) => void

Wire every item inside scope (recursively) that has a submenu: ARIA, hidden, popover promotion, anchor names, and item normalization. Idempotent, so it can run again after the DOM changes.