UNPKG

bootstrap-vue-next

Version:

BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.

131 lines (130 loc) 5.3 kB
import { defineComponent, mergeModels, useSlots, ref, useModel, computed, watchEffect, openBlock, createBlock, unref, withCtx, createElementBlock, normalizeClass, renderSlot, Fragment, mergeProps, createTextVNode, toDisplayString, createCommentVNode } from "vue"; import { _ as _sfc_main$1 } from "./BTransition.vue_vue_type_style_index_0_lang-X5a8jq3A.mjs"; import { _ as _sfc_main$3 } from "./BCloseButton.vue_vue_type_script_setup_true_lang-8cgz9_uq.mjs"; import { _ as _sfc_main$2 } from "./BButton.vue_vue_type_script_setup_true_lang-CiwgHFP2.mjs"; import { u as useCountdown, a as useCountdownHover } from "./useCountdownHover-Ds0unFZR.mjs"; import { u as useDefaults } from "./useDefaults-6tLPt05C.mjs"; import { i as isEmptySlot } from "./dom-B-SQyhbA.mjs"; import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.mjs"; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "BAlert", props: /* @__PURE__ */ mergeModels({ closeClass: { default: void 0 }, closeContent: { default: void 0 }, closeLabel: { default: "Close" }, closeVariant: { default: "secondary" }, dismissible: { type: Boolean, default: false }, fade: { type: Boolean, default: false }, immediate: { type: Boolean, default: true }, interval: { default: "requestAnimationFrame" }, noHoverPause: { type: Boolean, default: false }, noResumeOnHoverLeave: { type: Boolean, default: false }, showOnPause: { type: Boolean, default: true }, variant: { default: "info" } }, { "modelValue": { type: [Boolean, Number], ...{ default: false } }, "modelModifiers": {} }), emits: /* @__PURE__ */ mergeModels(["close", "close-countdown", "closed"], ["update:modelValue"]), setup(__props, { expose: __expose, emit: __emit }) { const _props = __props; const props = useDefaults(_props, "BAlert"); const emit = __emit; const slots = useSlots(); const element = ref(null); const modelValue = useModel(__props, "modelValue"); const hasCloseSlot = computed(() => !isEmptySlot(slots.close)); const countdownLength = computed( () => typeof modelValue.value === "boolean" ? 0 : modelValue.value ); const computedClasses = computed(() => ({ [`alert-${props.variant}`]: props.variant !== null, "alert-dismissible": props.dismissible })); const closeClasses = computed(() => [props.closeClass, { "btn-close-custom": hasCloseSlot.value }]); const { isActive, pause, resume, stop, isPaused, restart, value: remainingMs } = useCountdown(countdownLength, props.interval, { immediate: typeof modelValue.value === "number" && props.immediate }); useCountdownHover( element, computed(() => ({ noHoverPause: props.noHoverPause, noResumeOnHoverLeave: props.noResumeOnHoverLeave })), { pause, resume } ); const isAlertVisible = computed( () => typeof modelValue.value === "boolean" ? modelValue.value : isActive.value || props.showOnPause && isPaused.value ); const closeAttrs = computed(() => ({ variant: hasCloseSlot.value ? props.closeVariant : void 0, class: closeClasses.value })); watchEffect(() => { emit("close-countdown", remainingMs.value); }); const hide = () => { emit("close"); if (typeof modelValue.value === "boolean") { modelValue.value = false; } else { modelValue.value = 0; stop(); } emit("closed"); }; __expose({ pause, resume, stop, restart }); return (_ctx, _cache) => { return openBlock(), createBlock(_sfc_main$1, { "no-fade": !unref(props).fade, "trans-props": { enterToClass: "show" } }, { default: withCtx(() => [ isAlertVisible.value ? (openBlock(), createElementBlock("div", { key: 0, ref_key: "element", ref: element, class: normalizeClass(["alert", computedClasses.value]), role: "alert", "aria-live": "polite", "aria-atomic": "true" }, [ renderSlot(_ctx.$slots, "default", {}, void 0, true), unref(props).dismissible ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ hasCloseSlot.value || unref(props).closeContent ? (openBlock(), createBlock(_sfc_main$2, mergeProps({ key: 0 }, closeAttrs.value, { onClick: hide }), { default: withCtx(() => [ renderSlot(_ctx.$slots, "close", {}, () => [ createTextVNode(toDisplayString(unref(props).closeContent), 1) ], true) ]), _: 3 }, 16)) : (openBlock(), createBlock(_sfc_main$3, mergeProps({ key: 1, "aria-label": unref(props).closeLabel }, closeAttrs.value, { onClick: hide }), null, 16, ["aria-label"])) ], 64)) : createCommentVNode("", true) ], 2)) : createCommentVNode("", true) ]), _: 3 }, 8, ["no-fade"]); }; } }); const BAlert = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d1c92ab3"]]); export { BAlert as B }; //# sourceMappingURL=BAlert-DVemcauI.mjs.map