UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 33.4 kB
{"version":3,"file":"slider.cjs","sources":["../../src/components/slider/SliderThumb.vue","../../src/components/slider/SliderTick.vue","../../src/components/slider/Slider.vue","../../src/components/slider/index.ts"],"sourcesContent":["<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref } from \"vue\";\n\nimport OTooltip from \"../tooltip/Tooltip.vue\";\n\nimport { isClient } from \"@/utils/ssr\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SliderProps } from \"./props\";\nimport type { ClassBind, WithRequired } from \"@/types\";\n\n/**\n * @displayName Slider Thumb\n */\ndefineOptions({\n isOruga: true,\n name: \"OSliderThumb\",\n configField: \"slider\",\n inheritAttrs: false,\n});\n\nconst props = defineProps<{\n /** parent slider component props */\n sliderProps: WithRequired<SliderProps<IsRange>, \"min\" | \"max\" | \"step\">;\n modelValue: number;\n sliderSize: () => number;\n thumbWrapperClasses: ClassBind[];\n thumbClasses: ClassBind[];\n}>();\n\nconst emits = defineEmits<{\n /**\n * modelValue prop two-way binding\n * @param value {number | number[]} updated modelValue prop\n */\n \"update:model-value\": [value: number | number[]];\n /** on value change event */\n change: [];\n /** on drag start event */\n dragstart: [];\n /** on drag end event */\n dragend: [];\n}>();\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst isFocused = ref(false);\nconst dragging = ref(false);\nconst startX = ref(0);\nconst startPosition = ref(0);\nconst newPosition = ref<number>();\nconst oldValue = ref(props.modelValue);\n\nconst tooltip = computed(() => props.sliderProps.tooltip);\nconst tooltipAlways = computed(() => props.sliderProps.tooltipAlways);\nconst disabled = computed(() => props.sliderProps.disabled);\nconst max = computed(() => props.sliderProps.max);\nconst min = computed(() => props.sliderProps.min);\nconst step = computed(() => props.sliderProps.step);\nconst indicator = computed(() => props.sliderProps.indicator);\nconst ariaLabel = computed(() => props.sliderProps.ariaLabel);\n\nconst precision = computed(() => {\n const precisions = [min.value, max.value, step.value].map((item) => {\n const decimal = (\"\" + item).split(\".\")[1];\n return decimal ? decimal.length : 0;\n });\n return Math.max(...precisions);\n});\n\nconst computedTooltipVariant = computed(() =>\n props.sliderProps.tooltipVariant\n ? props.sliderProps.tooltipVariant\n : props.sliderProps.variant,\n);\n\nconst currentPosition = computed(\n () =>\n `${((props.modelValue - min.value) / (max.value - min.value)) * 100}%`,\n);\n\nconst wrapperStyle = computed(() => ({ left: currentPosition.value }));\n\nconst formattedValue = computed(() => {\n if (typeof props.sliderProps.formatter !== \"undefined\")\n return props.sliderProps.formatter(props.modelValue);\n\n if (props.sliderProps.format === \"percent\")\n return new Intl.NumberFormat(props.sliderProps.locale, {\n style: \"percent\",\n }).format((props.modelValue - min.value) / (max.value - min.value));\n\n return new Intl.NumberFormat(props.sliderProps.locale).format(\n props.modelValue,\n );\n});\n\nfunction onFocus(): void {\n isFocused.value = true;\n}\n\nfunction onBlur(): void {\n isFocused.value = false;\n}\n\nfunction onButtonDown(event): void {\n if (disabled.value) return;\n event.preventDefault();\n onDragStart(event);\n\n if (isClient) {\n document.addEventListener(\"mousemove\", onDragging);\n document.addEventListener(\"touchmove\", onDragging);\n document.addEventListener(\"mouseup\", onDragEnd);\n document.addEventListener(\"touchend\", onDragEnd);\n document.addEventListener(\"contextmenu\", onDragEnd);\n }\n}\n\nfunction onLeftKeyDown(): void {\n if (disabled.value || props.modelValue === min.value) return;\n newPosition.value =\n parseFloat(currentPosition.value) -\n (step.value / (max.value - min.value)) * 100;\n setPosition(newPosition.value);\n emits(\"change\");\n}\n\nfunction onRightKeyDown(): void {\n if (disabled.value || props.modelValue === max.value) return;\n newPosition.value =\n parseFloat(currentPosition.value) +\n (step.value / (max.value - min.value)) * 100;\n setPosition(newPosition.value);\n emits(\"change\");\n}\n\nfunction onHomeKeyDown(): void {\n if (disabled.value || props.modelValue === min.value) return;\n newPosition.value = 0;\n setPosition(newPosition.value);\n emits(\"change\");\n}\n\nfunction onEndKeyDown(): void {\n if (disabled.value || props.modelValue === max.value) return;\n newPosition.value = 100;\n setPosition(newPosition.value);\n emits(\"change\");\n}\n\nfunction onDragStart(event): void {\n dragging.value = true;\n emits(\"dragstart\");\n if (event.type === \"touchstart\") event.clientX = event.touches[0].clientX;\n\n startX.value = event.clientX;\n startPosition.value = parseFloat(currentPosition.value);\n newPosition.value = startPosition.value;\n}\n\nfunction onDragging(event): void {\n if (dragging.value) {\n if (event.type === \"touchmove\")\n event.clientX = event.touches[0].clientX;\n\n const diff =\n ((event.clientX - startX.value) / props.sliderSize()) * 100;\n newPosition.value = startPosition.value + diff;\n setPosition(newPosition.value);\n }\n}\n\nfunction onDragEnd(): void {\n dragging.value = false;\n emits(\"dragend\");\n if (props.modelValue !== oldValue.value) emits(\"change\");\n\n setPosition(newPosition.value);\n if (isClient) {\n document.removeEventListener(\"mousemove\", onDragging);\n document.removeEventListener(\"touchmove\", onDragging);\n document.removeEventListener(\"mouseup\", onDragEnd);\n document.removeEventListener(\"touchend\", onDragEnd);\n document.removeEventListener(\"contextmenu\", onDragEnd);\n }\n}\n\nfunction setPosition(percent: number | undefined): void {\n if (percent === undefined || isNaN(percent)) return;\n if (percent < 0) percent = 0;\n else if (percent > 100) percent = 100;\n\n const stepLength = 100 / ((max.value - min.value) / step.value);\n const steps = Math.round(percent / stepLength);\n let value =\n ((steps * stepLength) / 100) * (max.value - min.value) + min.value;\n value = parseFloat(value.toFixed(precision.value));\n emits(\"update:model-value\", value);\n\n if (!dragging.value && value !== oldValue.value) oldValue.value = value;\n}\n\ndefineExpose({ setPosition });\n</script>\n\n<template>\n <div\n data-oruga=\"slider-thumb\"\n :class=\"thumbWrapperClasses\"\n :style=\"wrapperStyle\">\n <o-tooltip\n :label=\"formattedValue\"\n :variant=\"computedTooltipVariant\"\n :disabled=\"disabled || !tooltip\"\n :always=\"tooltipAlways || dragging || isFocused\">\n <div\n v-bind=\"$attrs\"\n :class=\"thumbClasses\"\n :tabindex=\"disabled ? undefined : 0\"\n role=\"slider\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"parentField?.labelId\"\n :aria-valuenow=\"modelValue\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-disabled=\"disabled\"\n aria-orientation=\"horizontal\"\n @mousedown=\"onButtonDown\"\n @touchstart.passive=\"onButtonDown\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown.left.prevent=\"onLeftKeyDown\"\n @keydown.right.prevent=\"onRightKeyDown\"\n @keydown.down.prevent=\"onLeftKeyDown\"\n @keydown.up.prevent=\"onRightKeyDown\"\n @keydown.home.prevent=\"onHomeKeyDown\"\n @keydown.end.prevent=\"onEndKeyDown\">\n <span v-if=\"indicator\">{{ formattedValue }}</span>\n </div>\n </o-tooltip>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from \"vue\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { ComponentClass } from \"@/types\";\n\n/**\n * @displayName Slider Tick\n */\ndefineOptions({\n isOruga: true,\n name: \"OSliderTick\",\n configField: \"slider\",\n});\n\nconst props = defineProps({\n /** Override existing theme classes completely */\n override: { type: Boolean, default: undefined },\n /** Value of single tick */\n value: { type: Number, required: true },\n /** Tick label */\n label: { type: [String, Number], default: undefined },\n tickClass: {\n type: [String, Function, Array] as PropType<ComponentClass>,\n default: undefined,\n },\n /** Class when slider tick is hidden */\n tickHiddenClass: {\n type: [String, Function, Array] as PropType<ComponentClass>,\n default: undefined,\n },\n /** Class of tick label */\n tickLabelClass: {\n type: [String, Function, Array] as PropType<ComponentClass>,\n default: undefined,\n },\n});\n\n/** inject functionalities and data from the parent component */\nconst { parent } = useProviderChild<SliderComponent>({ register: false });\n\nconst position = computed(() => {\n const pos =\n ((props.value - parent.value.min) /\n (parent.value.max - parent.value.min)) *\n 100;\n return pos >= 0 && pos <= 100 ? pos : 0;\n});\n\nconst hidden = computed(\n () => props.value === parent.value.min || props.value === parent.value.max,\n);\n\nconst tickStyle = computed(() => ({ left: position.value + \"%\" }));\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n [\"tickClass\", \"o-slider__tick\"],\n [\"tickHiddenClass\", \"o-slider__tick--hidden\", null, hidden],\n);\n\nconst tickLabelClasses = defineClasses([\n \"tickLabelClass\",\n \"o-slider__tick-label\",\n]);\n</script>\n\n<template>\n <div data-oruga=\"slider-tick\" :class=\"rootClasses\" :style=\"tickStyle\">\n <span v-if=\"$slots.default || label\" :class=\"tickLabelClasses\">\n <!-- \n @slot Override tick content, default is label prop\n -->\n <slot> {{ label }} </slot>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport OSliderThumb from \"./SliderThumb.vue\";\nimport OSliderTick from \"./SliderTick.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport { defineClasses, useProviderParent } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { SliderProps } from \"./props\";\n\n/**\n * A slider to select a value or range from a given range.\n * @displayName Slider\n * @requires ./SliderTick.vue\n * @style _slider.scss\n */\ndefineOptions({\n isOruga: true,\n name: \"OSlider\",\n configField: \"slider\",\n});\n\ntype ModelValue = SliderProps<IsRange>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<SliderProps<IsRange>>(), {\n override: undefined,\n modelValue: undefined,\n // range: false,\n min: 0,\n max: 100,\n step: 1,\n variant: () => getDefault(\"slider.variant\"),\n size: () => getDefault(\"slider.size\"),\n ticks: false,\n tooltip: () => getDefault(\"slider.tooltip\", true),\n tooltipVariant: () => getDefault(\"slider.tooltipVariant\"),\n tooltipAlways: false,\n rounded: () => getDefault(\"slider.rounded\", false),\n disabled: false,\n lazy: false,\n formatter: undefined,\n biggerSliderFocus: false,\n indicator: false,\n format: () => getDefault(\"slider.format\", \"raw\"),\n locale: () => getDefault(\"locale\"),\n ariaLabel: () => getDefault(\"slider.ariaLabel\"),\n});\n\nconst emits = defineEmits<{\n /**\n * modelValue prop two-way binding\n * @param value {number | number[]} updated modelValue prop\n */\n \"update:model-value\": [value: ModelValue];\n /**\n * on value change event\n * @param value {number | number[]} updated modelValue prop\n */\n change: [value: ModelValue];\n /**\n * on dragging event\n * @param value {number | number[]} updated modelValue prop\n * */\n dragging: [value: ModelValue];\n /** on drag start event */\n dragstart: [];\n /** on drag end event */\n dragend: [];\n}>();\n\nconst sliderRef = useTemplateRef(\"sliderElement\");\nconst thumbStartRef = useTemplateRef(\"thumbStartComponent\");\nconst thumbEndRef = useTemplateRef(\"thumbEndComponent\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<SliderComponent>(() => ({\n max: props.max,\n min: props.min,\n}));\n\n/** provide functionalities and data to child item components */\nuseProviderParent({ data: provideData });\n\nconst valueStart = ref<number>(0);\nconst valueEnd = ref<number>(0);\nconst dragging = ref(false);\n\nconst isThumbReversed = ref();\nconst isTrackClickDisabled = ref();\n\nconst minValue = computed(() =>\n Math.min(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst maxValue = computed(() =>\n Math.max(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst isRange = computed(() => isTrueish(props.range));\n\nconst vmodel = computed<ModelValue>(\n () =>\n (isRange.value\n ? [minValue.value, maxValue.value]\n : valueStart.value || 0) as ModelValue,\n);\n\n/** update vmodel value on internal value change */\nwatch([valueStart, valueEnd], () => {\n if (isRange.value)\n isThumbReversed.value =\n valueStart.value && valueEnd.value\n ? valueStart.value > valueEnd.value\n : false;\n if (!props.lazy || !dragging.value)\n emits(\"update:model-value\", vmodel.value); // update external vmodel\n if (dragging.value) emits(\"dragging\", vmodel.value);\n});\n\n/** When min, max or v-model is changed set the new active step. */\nwatch(\n [() => props.min, () => props.max, () => props.modelValue],\n () => setValues(props.modelValue),\n { immediate: true }, // initialise valueStart and valueEnd\n);\n\nfunction setValues(newValue: number | number[] | undefined): void {\n if (props.min > props.max) return;\n\n if (Array.isArray(newValue)) {\n const smallValue =\n typeof newValue[0] !== \"number\" || isNaN(newValue[0])\n ? props.min\n : Math.min(Math.max(props.min, newValue[0]), props.max);\n const largeValue =\n typeof newValue[1] !== \"number\" || isNaN(newValue[1])\n ? props.max\n : Math.max(Math.min(props.max, newValue[1]), props.min);\n valueStart.value = isThumbReversed.value ? largeValue : smallValue;\n valueEnd.value = isThumbReversed.value ? smallValue : largeValue;\n } else if (newValue !== undefined) {\n valueStart.value = isNaN(newValue)\n ? props.min\n : Math.min(props.max, Math.max(props.min, newValue));\n valueEnd.value = 0;\n } else {\n valueStart.value = props.min;\n valueEnd.value = props.min;\n }\n}\n\nconst tickValues = computed(() => {\n if (!props.ticks || props.min > props.max || props.step === 0) return [];\n const result: number[] = [];\n for (let i = props.min + props.step; i < props.max; i = i + props.step) {\n result.push(i);\n }\n return result;\n});\n\nconst barSize = computed(() =>\n isRange.value\n ? `${\n (100 * (maxValue.value - minValue.value)) /\n (props.max - props.min)\n }%`\n : `${\n (100 * (valueStart.value - props.min)) / (props.max - props.min)\n }%`,\n);\n\nconst barStart = computed(() =>\n isRange.value\n ? `${(100 * (minValue.value - props.min)) / (props.max - props.min)}%`\n : \"0%\",\n);\n\nconst barStyle = computed(() => ({\n width: barSize.value,\n left: barStart.value,\n}));\n\nfunction getSliderSize(): number {\n return sliderRef.value?.getBoundingClientRect().width || 0;\n}\n\nfunction onSliderClick(event: MouseEvent): void {\n if (props.disabled || isTrackClickDisabled.value) return;\n if (\n !sliderRef.value ||\n !thumbStartRef.value ||\n (isRange.value && !thumbEndRef.value)\n )\n return;\n\n const sliderOffsetLeft = sliderRef.value.getBoundingClientRect().left;\n const percent =\n ((event.clientX - sliderOffsetLeft) / getSliderSize()) * 100;\n const targetValue = props.min + (percent * (props.max - props.min)) / 100;\n const diffFirst = Math.abs(targetValue - valueStart.value);\n if (!isRange.value) {\n if (diffFirst < props.step / 2) return;\n thumbStartRef.value.setPosition(percent);\n } else {\n const diffSecond = Math.abs(targetValue - valueEnd.value);\n if (diffFirst <= diffSecond) {\n if (diffFirst < props.step / 2) return;\n thumbStartRef.value.setPosition(percent);\n } else {\n if (diffSecond < props.step / 2) return;\n if (isRange.value && thumbEndRef.value)\n thumbEndRef.value.setPosition(percent);\n }\n }\n emits(\"change\", vmodel.value);\n}\n\nfunction onDragStart(): void {\n dragging.value = true;\n emits(\"dragstart\");\n}\n\nfunction onDragEnd(): void {\n isTrackClickDisabled.value = true;\n // avoid triggering onSliderClick after dragend\n setTimeout(() => (isTrackClickDisabled.value = false));\n dragging.value = false;\n emits(\"dragend\");\n if (props.lazy) emits(\"update:model-value\", vmodel.value);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n [\"rootClass\", \"o-slider\"],\n [\n \"sizeClass\",\n \"o-slider--\",\n computed(() => props.size),\n computed(() => !!props.size),\n ],\n [\n \"disabledClass\",\n \"o-slider--disabled\",\n null,\n computed(() => props.disabled),\n ],\n);\n\nconst trackClasses = defineClasses([\"trackClass\", \"o-slider__track\"]);\n\nconst fillClasses = defineClasses(\n [\"fillClass\", \"o-slider__fill\"],\n [\n \"variantClass\",\n \"o-slider__fill--\",\n computed(() => props.variant),\n computed(() => !!props.variant),\n ],\n);\n\nconst thumbWrapperClasses = defineClasses(\n [\"thumbWrapperClass\", \"o-slider__thumb-wrapper\"],\n [\n \"thumbWrapperDraggingClass\",\n \"o-slider__thumb-wrapper--dragging\",\n null,\n dragging,\n ],\n);\n\nconst thumbClasses = defineClasses(\n [\"thumbClass\", \"o-slider__thumb\"],\n [\"thumbDraggingClass\", \"o-slider__thumb--dragging\", null, dragging],\n [\n \"thumbRoundedClass\",\n \"o-slider__thumb--rounded\",\n null,\n computed(() => props.rounded),\n ],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ value: vmodel });\n</script>\n\n<template>\n <div data-oruga=\"slider\" :class=\"rootClasses\" @click=\"onSliderClick\">\n <div ref=\"sliderElement\" :class=\"trackClasses\">\n <div :class=\"fillClasses\" :style=\"barStyle\" />\n\n <template v-if=\"ticks\">\n <o-slider-tick\n v-for=\"(val, key) in tickValues\"\n :key=\"key\"\n :value=\"val\"\n :tick-class=\"tickClass\"\n :tick-hidden-class=\"tickHiddenClass\"\n :tick-label-class=\"tickLabelClass\" />\n </template>\n\n <!--\n @slot Define additional slider ticks here\n -->\n <slot />\n\n <o-slider-thumb\n ref=\"thumbStartComponent\"\n v-model=\"valueStart\"\n :slider-props=\"props\"\n :slider-size=\"getSliderSize\"\n :thumb-classes=\"thumbClasses\"\n :thumb-wrapper-classes=\"thumbWrapperClasses\"\n @change=\"emits('change', vmodel)\"\n @dragstart=\"onDragStart\"\n @dragend=\"onDragEnd\" />\n\n <o-slider-thumb\n v-if=\"isRange\"\n ref=\"thumbEndComponent\"\n v-model=\"valueEnd\"\n :slider-props=\"props\"\n :slider-size=\"getSliderSize\"\n :thumb-classes=\"thumbClasses\"\n :thumb-wrapper-classes=\"thumbWrapperClasses\"\n @change=\"emits('change', vmodel)\"\n @dragstart=\"onDragStart\"\n @dragend=\"onDragEnd\" />\n </div>\n </div>\n</template>\n","import type { App, Plugin } from \"vue\";\n\nimport Slider from \"./Slider.vue\";\nimport SliderTick from \"./SliderTick.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\n\n/** export slider specific types */\nexport type * from \"./types\";\n\n/** export slider plugin */\nexport default {\n install(app: App) {\n registerComponent(app, Slider);\n registerComponent(app, SliderTick);\n },\n} as Plugin;\n\n/** export slider components */\nexport { Slider as OSlider, SliderTick as OSliderTick };\n"],"names":["injectField","ref","computed","isClient","_createElementBlock","thumbWrapperClasses","_createVNode","OTooltip","_createElementVNode","_mergeProps","thumbClasses","_unref","modelValue","_openBlock","useProviderChild","defineClasses","$slots","_renderSlot","useTemplateRef","useProviderParent","isTrueish","watch","ticks","_Fragment","_renderList","_createBlock","OSliderTick","tickClass","tickHiddenClass","tickLabelClass","OSliderThumb","registerComponent","Slider","SliderTick"],"mappings":"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"}