UNPKG

maz-ui

Version:

A standalone components library for Vue.Js 3 & Nuxt.Js 3

76 lines (75 loc) 3.32 kB
import { defineComponent, computed, ref, watch, onMounted, onBeforeUnmount, createBlock, openBlock, Teleport, createElementVNode, mergeProps, normalizeStyle, normalizeClass, nextTick } from "vue"; import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper.B--vMWp3.js"; import '../assets/MazReadingProgressBar.BTwBuC_9.css';function throttle(func, limit) { let inThrottle = !1, lastFunc, lastRan; return function(...args) { inThrottle ? (clearTimeout(lastFunc), lastFunc = setTimeout(() => { Date.now() - lastRan >= limit && (func.apply(this, args), lastRan = Date.now()); }, Math.max(limit - (Date.now() - lastRan), 0))) : (func.apply(this, args), lastRan = Date.now(), inThrottle = !0); }; } const _sfc_main = /* @__PURE__ */ defineComponent({ inheritAttrs: !1, __name: "MazReadingProgressBar", props: { height: { default: "4px" }, color: { default: "primary" }, teleportSelector: { default: "body" }, contentSelector: { default: "body" }, offset: { default: 0 }, barClass: { default: void 0 }, distance: { default: void 0 } }, emits: ["begin", "complete"], setup(__props, { emit: __emit }) { const props = __props, emits = __emit, barColor = computed(() => `hsl(var(--maz-${props.color}))`), progressBarWidth = ref(), elementHeight = ref(0); watch( () => props.distance, (value) => { value && (elementHeight.value = value); }, { immediate: !0 } ); const handleScroll = throttle(() => { const scrollPosition = window.scrollY; if (scrollPosition >= 0 && scrollPosition <= elementHeight.value) { const progress = scrollPosition / elementHeight.value * 100; progressBarWidth.value = `${progress}%`; } else scrollPosition <= 0 ? (progressBarWidth.value = "0%", emits("begin")) : scrollPosition > elementHeight.value ? (progressBarWidth.value = "100%", emits("complete")) : progressBarWidth.value = "0%"; }, 15); async function setupScroll() { if (elementHeight.value === 0) { const element = document.querySelector(props.contentSelector); if (!element) { console.error(`HTML Element with selector "${props.contentSelector}" not found.`); return; } await nextTick(), elementHeight.value = element.offsetHeight + element.offsetTop + props.offset - window.innerHeight; } window.addEventListener("scroll", handleScroll, { passive: !0 }); } return onMounted(() => { setupScroll(); }), onBeforeUnmount(() => { window.removeEventListener("scroll", handleScroll); }), (_ctx, _cache) => (openBlock(), createBlock(Teleport, { to: __props.teleportSelector }, [ createElementVNode("div", mergeProps({ class: "m-reading-progress-bar m-reset-css" }, _ctx.$attrs), [ createElementVNode("div", { class: normalizeClass(__props.barClass), style: normalizeStyle({ width: progressBarWidth.value ?? "0px", height: __props.height, backgroundColor: barColor.value }) }, null, 6) ], 16) ], 8, ["to"])); } }), MazReadingProgressBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-559b9313"]]); export { MazReadingProgressBar as default };