You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

43 lines
1.4 KiB

export default function bs(Alpine) {
Alpine.directive('bs', (el, { value, modifiers, expression }, { evaluateLater, cleanup }) => {
let evaluate = expression ? evaluateLater(expression) : () => { }
let handler = e => {
evaluate(() => { }, { scope: { '$event': e }, params: [e] })
}
let wrapHandler = (callback, wrapper) => (e) => wrapper(callback, e)
const eventName = `${modifiers}.bs.${value}`
handler = wrapHandler(handler, (next, e) => {
next(e);
});
el.addEventListener(eventName, handler);
cleanup(() => {
el.removeEventListener(eventName, handler)
})
})
Alpine.magic('bs', (el) => {
return new Proxy({}, {
get(target, type) {
return {
on(event, callback) {
el.addEventListener(`${event}.bs.${type}`, (e) => {
callback(e);
});
},
instance(element = undefined) {
const className = type.charAt(0).toUpperCase() + type.slice(1);
return bootstrap[className].getInstance(element ?? el);
},
updateHTML(attr, html) {
el.querySelector(attr).innerHTML = html
}
};
}
});
});
}