@dvcol/svelte-utils
Version:
Svelte library for common utility functions and constants
49 lines (48 loc) • 1.66 kB
JavaScript
import { debounce } from '@dvcol/common-utils/common/debounce';
import { getFocusableElement } from '@dvcol/common-utils/common/element';
export const focusin = (node, options) => {
let params = options;
const setState = (value, e) => {
if (value === params.focusin)
return;
params.focusin = value;
params.onChange?.(value, e);
};
const onFocus = (e) => {
if (params.focusin)
return;
setState(true, e);
};
const onBlur = debounce((e) => {
if (!params.focusin)
return;
if (node.contains(document.activeElement))
return;
setState(false, e);
}, options.debounce ?? 0);
node.addEventListener('focusin', onFocus, { passive: true });
node.addEventListener('focusout', onBlur, { passive: true });
return {
update: (_options) => {
params = _options;
if (params.mirror === false)
return;
const isFocused = node.contains(document.activeElement);
if (isFocused === params.focusin)
return;
if (params.focusin) {
node.focus();
if (node.contains(document.activeElement))
return;
return getFocusableElement(node)?.focus();
}
if (!(document.activeElement instanceof HTMLElement))
return;
return document.activeElement.blur();
},
destroy: () => {
node.removeEventListener('focusin', onFocus);
node.removeEventListener('focusout', onBlur);
},
};
};