UNPKG

bootstrap-vue-next

Version:

Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development

156 lines (155 loc) 5.22 kB
require("./chunk-CoQrYLCe.js"); const require_keys = require("./keys-durSVUrO.js"); const require_dom = require("./dom-Bs6DzM72.js"); const require_useDefaults = require("./useDefaults-DK6Y9lar.js"); require("./constants-DMR5FAE3.js"); require("./BButton-BID3NrxE.js"); require("./BCloseButton-CgIVNv2g.js"); let vue = require("vue"); //#endregion //#region src/components/BButton/BButtonGroup.vue var BButtonGroup_default = /* @__PURE__ */ (0, vue.defineComponent)({ __name: "BButtonGroup", props: { ariaLabel: { default: "Group" }, size: { default: "md" }, tag: { default: "div" }, vertical: { type: Boolean, default: false } }, setup(__props) { (0, vue.provide)(require_keys.buttonGroupKey, true); const props = require_useDefaults.useDefaults(__props, "BButtonGroup"); const computedClasses = (0, vue.computed)(() => ({ "btn-group": !props.vertical, [`btn-group-${props.size}`]: props.size !== "md", "btn-group-vertical": props.vertical })); return (_ctx, _cache) => { return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(props).tag), { class: (0, vue.normalizeClass)(computedClasses.value), role: "group", "aria-label": (0, vue.unref)(props).ariaLabel }, { default: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "default")]), _: 3 }, 8, ["class", "aria-label"]); }; } }); //#endregion //#region src/components/BButton/BButtonToolbar.vue?vue&type=script&setup=true&lang.ts var _hoisted_1 = ["role", "aria-label"]; //#endregion //#region src/components/BButton/BButtonToolbar.vue var BButtonToolbar_default = /* @__PURE__ */ (0, vue.defineComponent)({ __name: "BButtonToolbar", props: { ariaLabel: { default: "Group" }, keyNav: { type: Boolean, default: false }, justify: { type: Boolean, default: false }, role: { default: "toolbar" } }, setup(__props) { const props = require_useDefaults.useDefaults(__props, "BButtonToolbar"); const toolbarRef = (0, vue.useTemplateRef)("toolbarRef"); const computedClasses = (0, vue.computed)(() => ({ "justify-content-between": props.justify })); const getFocusableElements = () => { if (!toolbarRef.value) return []; return Array.from(toolbarRef.value.querySelectorAll("button:not(:disabled), [href]:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"]):not(:disabled)")).filter((el) => { const style = require_dom.getSafeWindow()?.getComputedStyle(el); return style && style.display !== "none" && style.visibility !== "hidden"; }); }; const isDisabled = (element) => element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true"; const focusFirst = () => { (0, vue.nextTick)(() => { getFocusableElements().find((el) => !isDisabled(el))?.focus(); }); }; const focusLast = () => { (0, vue.nextTick)(() => { getFocusableElements().reverse().find((el) => !isDisabled(el))?.focus(); }); }; const focusPrev = () => { (0, vue.nextTick)(() => { const elements = getFocusableElements(); const activeElement = require_dom.getActiveElement(); const currentIndex = elements.indexOf(activeElement); if (currentIndex > 0) for (let i = currentIndex - 1; i >= 0; i--) { const el = elements[i]; if (el !== void 0 && !isDisabled(el)) { elements[i]?.focus(); break; } } }); }; const focusNext = () => { (0, vue.nextTick)(() => { const elements = getFocusableElements(); const activeElement = require_dom.getActiveElement(); const currentIndex = elements.indexOf(activeElement); if (currentIndex < elements.length - 1) for (let i = currentIndex + 1; i < elements.length; i++) { const el = elements[i]; if (el !== void 0 && !isDisabled(el)) { elements[i]?.focus(); break; } } }); }; const handleKeyNav = (event) => { if (!props.keyNav) return; const { code, shiftKey } = event; if (code === "ArrowLeft" || code === "ArrowUp") { event.preventDefault(); if (shiftKey) focusFirst(); else focusPrev(); } else if (code === "ArrowRight" || code === "ArrowDown") { event.preventDefault(); if (shiftKey) focusLast(); else focusNext(); } else if (code === "Home") { event.preventDefault(); focusFirst(); } else if (code === "End") { event.preventDefault(); focusLast(); } }; return (_ctx, _cache) => { return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { ref_key: "toolbarRef", ref: toolbarRef, class: (0, vue.normalizeClass)([computedClasses.value, "btn-toolbar"]), role: (0, vue.unref)(props).role, "aria-label": (0, vue.unref)(props).ariaLabel, onKeydown: handleKeyNav }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 42, _hoisted_1); }; } }); //#endregion Object.defineProperty(exports, "BButtonGroup_default", { enumerable: true, get: function() { return BButtonGroup_default; } }); Object.defineProperty(exports, "BButtonToolbar_default", { enumerable: true, get: function() { return BButtonToolbar_default; } }); //# sourceMappingURL=BButton-C_bVBx8e.js.map