File size: 1,622 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
// Modified from Grail UI v0.9.6 (2023-06-10)
// Source: https://github.com/grail-ui/grail-ui
// https://github.com/grail-ui/grail-ui/tree/master/packages/grail-ui/src/focusTrap/focusTrap.ts
import { writable, readonly } from 'svelte/store';
import { createFocusTrap as _createFocusTrap } from 'focus-trap';
export function createFocusTrap(config = {}) {
let trap;
const { immediate, ...focusTrapOptions } = config;
const hasFocus = writable(false);
const isPaused = writable(false);
const activate = (opts) => trap?.activate(opts);
const deactivate = (opts) => {
trap?.deactivate(opts);
};
const pause = () => {
if (trap) {
trap.pause();
isPaused.set(true);
}
};
const unpause = () => {
if (trap) {
trap.unpause();
isPaused.set(false);
}
};
const useFocusTrap = (node) => {
trap = _createFocusTrap(node, {
...focusTrapOptions,
onActivate() {
hasFocus.set(true);
config.onActivate?.();
},
onDeactivate() {
hasFocus.set(false);
config.onDeactivate?.();
},
});
if (immediate) {
activate();
}
return {
destroy() {
deactivate();
trap = undefined;
},
};
};
return {
useFocusTrap,
hasFocus: readonly(hasFocus),
isPaused: readonly(isPaused),
activate,
deactivate,
pause,
unpause,
};
}
|