frontend-patterns/research/experiments/boundary-recovery/routing-transform.mjs
tegwick 29ccad7002 Test lifecycle-aware Escape ownership routing without settling delays
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0cffe-206f-7323-89d3-b20ca4cf4bf9
2026-09-26 22:58:07 +02:00

49 lines
2.2 KiB
JavaScript

// Experimental in-memory patch to one pinned module, not an upstream/product change.
export function routeEscape(source) {
const start = source.indexOf(' const isHighestLayer = node ? index === layers.length - 1 : false;');
const end = source.indexOf(' React.useEffect(() => {\n if (!node) return;', start);
if (start < 0 || end < 0) throw new Error('Pinned source locators changed');
const helper = `
const fepDocuments = new WeakMap();
function fepRegister(doc, node, callback) {
let state = fepDocuments.get(doc);
if (!state) {
state = { owners: new Map() };
state.listener = event => {
if (event.key !== 'Escape' || event.defaultPrevented) return;
const entry = [...state.owners].filter(([element]) => element.isConnected).at(-1);
if (!entry) return;
window.routingObserved.trace.push({kind:'dispatch', owner:entry[0].getAttribute('aria-labelledby')});
// Snapshot one owner. No fall-through to the parent after cancellation or teardown.
entry[1](event);
};
doc.addEventListener('keydown', state.listener, {capture:true});
fepDocuments.set(doc, state);
}
state.owners.set(node, callback);
window.routingObserved.trace.push({kind:'register', owner:node.getAttribute('aria-labelledby'), count:state.owners.size});
return () => {
state.owners.delete(node);
window.routingObserved.trace.push({kind:'unregister', owner:node.getAttribute('aria-labelledby'), count:state.owners.size});
if (!state.owners.size) {
doc.removeEventListener('keydown', state.listener, {capture:true});
fepDocuments.delete(doc);
window.routingObserved.trace.push({kind:'listener-removed'});
}
};
}
`;
const replacement = ` const fepHandler = React.useRef(null);
React.useLayoutEffect(() => {
fepHandler.current = event => {
onEscapeKeyDown?.(event);
if (!event.defaultPrevented && onDismiss) {event.preventDefault();onDismiss();}
};
});
React.useLayoutEffect(() => {
if (!node) return;
return fepRegister(ownerDocument, node, event => fepHandler.current?.(event));
}, [node, ownerDocument]);
`;
return helper + source.slice(0,start) + replacement + source.slice(end);
}