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
JavaScript
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