diff options
Diffstat (limited to 'alpinejs/packages/trap/src/index.js')
-rw-r--r-- | alpinejs/packages/trap/src/index.js | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/alpinejs/packages/trap/src/index.js b/alpinejs/packages/trap/src/index.js new file mode 100644 index 0000000..2586f88 --- /dev/null +++ b/alpinejs/packages/trap/src/index.js @@ -0,0 +1,32 @@ +import { createFocusTrap } from 'focus-trap'; + +export default function (Alpine) { + Alpine.directive('trap', (el, { expression }, { effect, evaluateLater }) => { + let evaluator = evaluateLater(expression) + + let oldValue = false + + let trap = createFocusTrap(el, { + escapeDeactivates: false, + allowOutsideClick: true + }) + + effect(() => evaluator(value => { + if (oldValue === value) return + + // Start trapping. + if (value && ! oldValue) { + setTimeout(() => { + trap.activate() + }); + } + + // Stop trapping. + if (! value && oldValue) { + trap.deactivate() + } + + oldValue = !! value + })) + }) +} |