UNPKG

tass-ui

Version:

A high quality UI Toolkit built on Vue.js3+.

145 lines (144 loc) 4.88 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const vue = require("vue"); require("../../../theme-chalk/src/slider.scss.js"); const _hoisted_1 = { class: "tas-slider" }; const _hoisted_2 = { class: "tas-slider__content", draggable: false }; const _hoisted_3 = { class: "tas-slider__other" }; const _hoisted_4 = { class: "tas-slider__value" }; const _sfc_main = /* @__PURE__ */ vue.defineComponent({ __name: "slider", props: { min: { require: false, default: 0, type: Number }, max: { require: false, default: 100, type: Number }, step: { require: false, default: 1, type: Number }, value: { require: false, default: 0, type: Number }, disabled: { require: false, default: false, type: Boolean } }, emits: ["sliderChange"], setup(__props, { emit }) { const props = __props; let maxX = 0; let thumbWidth = 6; const sliderTrack = vue.ref(); const sliderThumb = vue.ref(); const sliderThumbStatusClass = vue.ref(""); const sliderValue = vue.ref(props.value); const sliderFillPercent = vue.ref(0); const distance = Number(props.max) - Number(props.min); if (sliderValue.value < Number(props.min)) { sliderValue.value = Number(props.min) || 0; } else if (sliderValue.value > Number(props.max)) { sliderValue.value = Number(props.max) || 100; } const thumbX = vue.ref("0px"); const thumbTop = vue.ref("-7px"); vue.onMounted(() => { var _a, _b, _c; thumbWidth = (((_a = sliderThumb.value) == null ? void 0 : _a.offsetWidth) || 0) / 2; thumbTop.value = -((((_b = sliderThumb.value) == null ? void 0 : _b.offsetHeight) || 0) / 2) + "px"; maxX = (((_c = sliderTrack.value) == null ? void 0 : _c.offsetWidth) || 0) - thumbWidth; sliderFillPercent.value = (sliderValue.value - Number(props.min)) / distance * 100; thumbX.value = (sliderValue.value - Number(props.min)) / distance * (maxX + thumbWidth) - thumbWidth + "px"; if (props.disabled) { sliderThumbStatusClass.value = "tas-slider__thumb-disabled"; } }); const handleClickTrack = (e) => { const targetX = e == null ? void 0 : e.offsetX; if (props.disabled) { return; } thumbX.value = targetX - thumbWidth + "px"; }; const thumbDown = (e) => { if (props.disabled) { return; } sliderThumbStatusClass.value = "tas-slider__thumb-active"; const startX = e == null ? void 0 : e.clientX; const initX = parseFloat(thumbX.value); const handler = (event) => { const nowX = event.clientX; const disX = nowX - startX; thumbX.value = initX + disX + "px"; if (initX + disX <= -thumbWidth) { thumbX.value = `-${thumbWidth}px`; } if (initX + disX > maxX) { thumbX.value = `${maxX}px`; } }; document.addEventListener("mousemove", handler, false); document.addEventListener( "mouseup", () => { sliderThumbStatusClass.value = ""; document.removeEventListener("mousemove", handler); }, false ); }; vue.watch(thumbX, () => { sliderFillPercent.value = (parseFloat(thumbX.value) + thumbWidth) / (maxX + thumbWidth) * 100; const b = (parseFloat(thumbX.value) + thumbWidth) / (maxX + thumbWidth) * distance + Number(props.min); const a = b % Number(props.step); sliderValue.value = b - a; emit("sliderChange", sliderValue.value); }); return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [ vue.createElementVNode("div", _hoisted_2, [ vue.createElementVNode("div", { class: "tas-slider__track", ref_key: "sliderTrack", ref: sliderTrack, draggable: false, onClick: handleClickTrack }, [ vue.createElementVNode("div", { class: "tas-slider__fill", style: vue.normalizeStyle({ width: sliderFillPercent.value + "%" }) }, null, 4) ], 512), vue.createElementVNode("div", { class: vue.normalizeClass(["tas-slider__thumb", sliderThumbStatusClass.value]), ref_key: "sliderThumb", ref: sliderThumb, style: vue.normalizeStyle({ left: thumbX.value }), onMousedown: thumbDown, draggable: false }, [ vue.createElementVNode("div", _hoisted_3, [ vue.createElementVNode("div", _hoisted_4, vue.toDisplayString(sliderValue.value), 1) ]) ], 38) ]) ]); }; } }); exports.default = _sfc_main;