Provider: provideFFlow(withA11y(...))
Events: (fDeleteSelected), (fMoveNodes), (fCreateConnection)
Every flow ships with two accessibility layers. The SEMANTIC layer is always on and needs no setup: it describes the graph to assistive technology. The KEYBOARD layer is opt-in — installing withA11y() makes the whole editor operable without a mouse, including creating connections entirely from the keyboard.
Applied automatically as items register; an attribute you set yourself is never overridden:
role="group" and an aria-roledescription ("node" / "group"). Their accessible name comes from your content — set aria-label on the element for an explicit one.role="group", aria-roledescription="connection" and a generated aria-label — "Connection from A to B" — that tracks endpoint changes. A label you set yourself stays untouched.id when they have none (needed for aria-activedescendant).f-connection-for-create, f-snap-connection) are aria-hidden — they are visual helpers, not content.With the feature installed, the f-flow host becomes the single tab stop (tabindex="0", role="application", keyboard instructions attached via aria-describedby). DOM focus never moves to the items — arrows drive the SELECTION directly, and the active item is exposed to assistive technology through aria-activedescendant. The selected style is the only visual state; the host's own focus ring is transparent (it is repainted by Windows High Contrast, so forced-colors users keep an indicator).
Keyboard map:
Tab — enters the flow; Tab again leaves it. Clicking inside the flow also activates the keyboard layer from the clicked item.Shift + arrow — extends the selection instead of replacing it.Ctrl/Cmd + arrow — topology walk: the connection leading that way is selected first, the next press lands on the node at its other end.Home / End — first / last node.Ctrl/Cmd + A — select all; Escape — clear the selection (or cancel the active mode).Space — move the selection: hold it and use arrows (release to drop), or tap to grab and tap again to drop — the second form is for users who cannot hold two keys at once. Shift + arrow moves in coarse steps; Escape reverts. The drop emits fMoveNodes with every moved node; a pointer drag and a keyboard move produce the same event.C — start a connection. Requires exactly one selected node; the proposal defaults to the nearest connector on another node that is not already connected to the source. Arrows move between connectable targets spatially with the usual preview and snapping, Enter emits fCreateConnection, Escape cancels. Connection rules (fConnectorDisabled, fCanBeConnectedTo, categories, multiplicity) apply exactly as in the drag gesture.Delete / Backspace — emits fDeleteSelected: FDeleteSelectedEvent (nodeIds, groupIds, connectionIds). The library never mutates the graph — remove the items from your data and the flow follows. Requires fDraggable.+ / - / 0 — zoom in, out and reset (when fZoom is present); the level is announced.Behavior notes:
input, textarea, select, button, links, [contenteditable], and anything with a non-negative tabindex — is never hijacked: keys typed there stay typing, and clicking such content does not steal its focus.Ctrl/Cmd+C stays copy.fSelectionDisabled nodes are skipped by navigation; fDraggingDisabled nodes cannot be grabbed.keyboard: false — keeps the keyboard layer off while still customizing messages.moveStep / coarseMoveStep — the arrow and Shift+arrow movement steps in canvas units.keys: IFA11yKeys — bindings per action: grab, connect, deleteSelected, selectAll (always with Ctrl/Cmd), zoomIn, zoomOut, zoomReset. Values are KeyboardEvent.key strings; single characters match case-insensitively; an empty array disables the action. Arrows, Enter and Escape are structural and stay fixed.messages: Partial<IFA11yMessages> — every announcement and attached string as a keyed catalog (plain strings and functions), for localization or rewording. The defaults are exported as F_DEFAULT_A11Y_MESSAGES.See the Accessibility example for a working editor with the full keyboard map, custom moveStep, and the delete/move/connect events wired to signals.