Files
2026-01-09 19:24:41 +00:00

831 lines
24 KiB
JavaScript

import {
VInput,
VLabel,
makeFocusProps,
makeVInputProps,
useFocus
} from "./chunk-IK67YVHF.js";
import {
useForm
} from "./chunk-GAYXO4FM.js";
import {
VScaleTransition
} from "./chunk-B4JFJDWM.js";
import {
forwardRefs
} from "./chunk-GUNW7S2L.js";
import {
makeElevationProps,
useElevation
} from "./chunk-YJD2PNP6.js";
import {
makeRoundedProps,
useRounded
} from "./chunk-AQK3CYVW.js";
import {
ripple_default
} from "./chunk-DS4J67XG.js";
import {
useBackgroundColor,
useTextColor
} from "./chunk-BHV5Z34M.js";
import {
useRtl
} from "./chunk-ENTLCOCZ.js";
import {
useProxiedModel
} from "./chunk-KA77II4V.js";
import {
clamp,
convertToUnit,
createRange,
filterInputAttrs,
genericComponent,
getDecimals,
keyValues,
makeComponentProps,
propsFactory,
useRender
} from "./chunk-LZ5T2ERG.js";
import {
Fragment,
computed,
createBaseVNode,
createVNode,
inject,
mergeProps,
nextTick,
normalizeClass,
normalizeStyle,
onScopeDispose,
provide,
ref,
shallowRef,
toRef,
vShow,
withDirectives
} from "./chunk-2MKFL3BX.js";
// node_modules/vuetify/lib/components/VSlider/VSlider.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSlider/VSlider.css";
// node_modules/vuetify/lib/components/VSlider/VSliderThumb.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSlider/VSliderThumb.css";
// node_modules/vuetify/lib/components/VSlider/slider.js
var VSliderSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-slider");
function getOffset(e, el, direction) {
const vertical = direction === "vertical";
const rect = el.getBoundingClientRect();
const touch = "touches" in e ? e.touches[0] : e;
return vertical ? touch.clientY - (rect.top + rect.height / 2) : touch.clientX - (rect.left + rect.width / 2);
}
function getPosition(e, position) {
if ("touches" in e && e.touches.length) return e.touches[0][position];
else if ("changedTouches" in e && e.changedTouches.length) return e.changedTouches[0][position];
else return e[position];
}
var makeSliderProps = propsFactory({
disabled: {
type: Boolean,
default: null
},
error: Boolean,
readonly: {
type: Boolean,
default: null
},
max: {
type: [Number, String],
default: 100
},
min: {
type: [Number, String],
default: 0
},
step: {
type: [Number, String],
default: 0
},
thumbColor: String,
thumbLabel: {
type: [Boolean, String],
default: void 0,
validator: (v) => typeof v === "boolean" || v === "always"
},
thumbSize: {
type: [Number, String],
default: 20
},
showTicks: {
type: [Boolean, String],
default: false,
validator: (v) => typeof v === "boolean" || v === "always"
},
ticks: {
type: [Array, Object]
},
tickSize: {
type: [Number, String],
default: 2
},
color: String,
trackColor: String,
trackFillColor: String,
trackSize: {
type: [Number, String],
default: 4
},
direction: {
type: String,
default: "horizontal",
validator: (v) => ["vertical", "horizontal"].includes(v)
},
reverse: Boolean,
noKeyboard: Boolean,
...makeRoundedProps(),
...makeElevationProps({
elevation: 2
}),
ripple: {
type: Boolean,
default: true
}
}, "Slider");
var useSteps = (props) => {
const min = computed(() => parseFloat(props.min));
const max = computed(() => parseFloat(props.max));
const step = computed(() => Number(props.step) > 0 ? parseFloat(props.step) : 0);
const decimals = computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
function roundValue(value) {
value = parseFloat(value);
if (step.value <= 0) return value;
const clamped = clamp(value, min.value, max.value);
const offset = min.value % step.value;
let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
if (clamped > newValue && newValue + step.value > max.value) {
newValue = max.value;
}
return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
}
return {
min,
max,
step,
decimals,
roundValue
};
};
var useSlider = (_ref) => {
let {
props,
steps,
onSliderStart,
onSliderMove,
onSliderEnd,
getActiveThumb
} = _ref;
const form = useForm(props);
const {
isRtl
} = useRtl();
const isReversed = toRef(() => props.reverse);
const vertical = computed(() => props.direction === "vertical");
const indexFromEnd = computed(() => vertical.value !== isReversed.value);
const {
min,
max,
step,
decimals,
roundValue
} = steps;
const thumbSize = computed(() => parseInt(props.thumbSize, 10));
const tickSize = computed(() => parseInt(props.tickSize, 10));
const trackSize = computed(() => parseInt(props.trackSize, 10));
const numTicks = computed(() => (max.value - min.value) / step.value);
const thumbColor = computed(() => props.error || form.isDisabled.value ? void 0 : props.thumbColor ?? props.color);
const thumbLabelColor = computed(() => props.error || form.isDisabled.value ? void 0 : props.thumbColor);
const trackColor = computed(() => props.error || form.isDisabled.value ? void 0 : props.trackColor ?? props.color);
const trackFillColor = computed(() => props.error || form.isDisabled.value ? void 0 : props.trackFillColor ?? props.color);
const mousePressed = shallowRef(false);
const startOffset = shallowRef(0);
const trackContainerRef = ref();
const activeThumbRef = ref();
function parseMouseMove(e) {
const el = trackContainerRef.value?.$el;
if (!el) return;
const vertical2 = props.direction === "vertical";
const start = vertical2 ? "top" : "left";
const length = vertical2 ? "height" : "width";
const position2 = vertical2 ? "clientY" : "clientX";
const {
[start]: trackStart,
[length]: trackLength
} = el.getBoundingClientRect();
const clickOffset = getPosition(e, position2);
let clickPos = clamp((clickOffset - trackStart - startOffset.value) / trackLength) || 0;
if (vertical2 ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos;
return roundValue(min.value + clickPos * (max.value - min.value));
}
const handleStop = (e) => {
const value = parseMouseMove(e);
if (value != null) {
onSliderEnd({
value
});
}
mousePressed.value = false;
startOffset.value = 0;
};
const handleStart = (e) => {
const value = parseMouseMove(e);
activeThumbRef.value = getActiveThumb(e);
if (!activeThumbRef.value) return;
mousePressed.value = true;
if (activeThumbRef.value.contains(e.target)) {
startOffset.value = getOffset(e, activeThumbRef.value, props.direction);
} else {
startOffset.value = 0;
if (value != null) {
onSliderMove({
value
});
}
}
if (value != null) {
onSliderStart({
value
});
}
nextTick(() => activeThumbRef.value?.focus());
};
const moveListenerOptions = {
passive: true,
capture: true
};
function onMouseMove(e) {
const value = parseMouseMove(e);
if (value != null) {
onSliderMove({
value
});
}
}
function onSliderMouseUp(e) {
e.stopPropagation();
e.preventDefault();
handleStop(e);
window.removeEventListener("mousemove", onMouseMove, moveListenerOptions);
window.removeEventListener("mouseup", onSliderMouseUp);
}
function onSliderTouchend(e) {
handleStop(e);
window.removeEventListener("touchmove", onMouseMove, moveListenerOptions);
e.target?.removeEventListener("touchend", onSliderTouchend);
}
function onSliderTouchstart(e) {
handleStart(e);
window.addEventListener("touchmove", onMouseMove, moveListenerOptions);
e.target?.addEventListener("touchend", onSliderTouchend, {
passive: false
});
}
function onSliderMousedown(e) {
if (e.button !== 0) return;
e.preventDefault();
handleStart(e);
window.addEventListener("mousemove", onMouseMove, moveListenerOptions);
window.addEventListener("mouseup", onSliderMouseUp, {
passive: false
});
}
onScopeDispose(() => {
window.removeEventListener("touchmove", onMouseMove);
window.removeEventListener("mousemove", onMouseMove);
window.removeEventListener("mouseup", onSliderMouseUp);
});
const position = (val) => {
const percentage = (val - min.value) / (max.value - min.value) * 100;
return clamp(isNaN(percentage) ? 0 : percentage, 0, 100);
};
const showTicks = toRef(() => props.showTicks);
const parsedTicks = computed(() => {
if (!showTicks.value) return [];
if (!props.ticks) {
return numTicks.value !== Infinity ? createRange(numTicks.value + 1).map((t) => {
const value = min.value + t * step.value;
return {
value,
position: position(value)
};
}) : [];
}
if (Array.isArray(props.ticks)) return props.ticks.map((t) => ({
value: t,
position: position(t),
label: t.toString()
}));
return Object.keys(props.ticks).map((key) => ({
value: parseFloat(key),
position: position(parseFloat(key)),
label: props.ticks[key]
}));
});
const hasLabels = computed(() => parsedTicks.value.some((_ref2) => {
let {
label
} = _ref2;
return !!label;
}));
const data = {
activeThumbRef,
color: toRef(() => props.color),
decimals,
disabled: form.isDisabled,
direction: toRef(() => props.direction),
elevation: toRef(() => props.elevation),
hasLabels,
isReversed,
indexFromEnd,
min,
max,
mousePressed,
noKeyboard: toRef(() => props.noKeyboard),
numTicks,
onSliderMousedown,
onSliderTouchstart,
parsedTicks,
parseMouseMove,
position,
readonly: form.isReadonly,
rounded: toRef(() => props.rounded),
roundValue,
showTicks,
startOffset,
step,
thumbSize,
thumbColor,
thumbLabelColor,
thumbLabel: toRef(() => props.thumbLabel),
ticks: toRef(() => props.ticks),
tickSize,
trackColor,
trackContainerRef,
trackFillColor,
trackSize,
vertical
};
provide(VSliderSymbol, data);
return data;
};
// node_modules/vuetify/lib/components/VSlider/VSliderThumb.js
var makeVSliderThumbProps = propsFactory({
focused: Boolean,
max: {
type: Number,
required: true
},
min: {
type: Number,
required: true
},
modelValue: {
type: Number,
required: true
},
position: {
type: Number,
required: true
},
ripple: {
type: [Boolean, Object],
default: true
},
name: String,
noKeyboard: Boolean,
...makeComponentProps()
}, "VSliderThumb");
var VSliderThumb = genericComponent()({
name: "VSliderThumb",
directives: {
vRipple: ripple_default
},
props: makeVSliderThumbProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
slots,
emit
} = _ref;
const slider = inject(VSliderSymbol);
const {
isRtl,
rtlClasses
} = useRtl();
if (!slider) throw new Error("[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider");
const {
min,
max,
thumbColor,
thumbLabelColor,
step,
disabled,
thumbSize,
thumbLabel,
direction,
isReversed,
vertical,
readonly,
elevation,
mousePressed,
decimals,
indexFromEnd
} = slider;
const elevationProps = computed(() => !disabled.value ? elevation.value : void 0);
const {
elevationClasses
} = useElevation(elevationProps);
const {
textColorClasses,
textColorStyles
} = useTextColor(thumbColor);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(thumbLabelColor);
const {
pageup,
pagedown,
end,
home,
left,
right,
down,
up
} = keyValues;
const relevantKeys = [pageup, pagedown, end, home, left, right, down, up];
const multipliers = computed(() => {
if (step.value) return [1, 2, 3];
else return [1, 5, 10];
});
function parseKeydown(e, value) {
if (props.noKeyboard || disabled.value) return;
if (!relevantKeys.includes(e.key)) return;
e.preventDefault();
const _step = step.value || 0.1;
const steps = (max.value - min.value) / _step;
if ([left, right, down, up].includes(e.key)) {
const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
const direction2 = increase.includes(e.key) ? 1 : -1;
const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
if (direction2 === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
value = value - steps % 1 * _step;
} else {
value = value + direction2 * _step * multipliers.value[multiplier];
}
} else if (e.key === home) {
value = min.value;
} else if (e.key === end) {
value = max.value;
} else {
const direction2 = e.key === pagedown ? 1 : -1;
value = value - direction2 * _step * (steps > 100 ? steps / 10 : 10);
}
return Math.max(props.min, Math.min(props.max, value));
}
function onKeydown(e) {
const newValue = parseKeydown(e, props.modelValue);
newValue != null && emit("update:modelValue", newValue);
}
useRender(() => {
const positionPercentage = convertToUnit(indexFromEnd.value ? 100 - props.position : props.position, "%");
return createBaseVNode("div", {
"class": normalizeClass(["v-slider-thumb", {
"v-slider-thumb--focused": props.focused,
"v-slider-thumb--pressed": props.focused && mousePressed.value
}, props.class, rtlClasses.value]),
"style": normalizeStyle([{
"--v-slider-thumb-position": positionPercentage,
"--v-slider-thumb-size": convertToUnit(thumbSize.value)
}, props.style]),
"role": "slider",
"tabindex": disabled.value ? -1 : 0,
"aria-label": props.name,
"aria-valuemin": min.value,
"aria-valuemax": max.value,
"aria-valuenow": props.modelValue,
"aria-readonly": !!readonly.value,
"aria-orientation": direction.value,
"onKeydown": !readonly.value ? onKeydown : void 0
}, [createBaseVNode("div", {
"class": normalizeClass(["v-slider-thumb__surface", textColorClasses.value, elevationClasses.value]),
"style": normalizeStyle(textColorStyles.value)
}, null), withDirectives(createBaseVNode("div", {
"class": normalizeClass(["v-slider-thumb__ripple", textColorClasses.value]),
"style": normalizeStyle(textColorStyles.value)
}, null), [[ripple_default, props.ripple, null, {
circle: true,
center: true
}]]), createVNode(VScaleTransition, {
"origin": "bottom center"
}, {
default: () => [withDirectives(createBaseVNode("div", {
"class": "v-slider-thumb__label-container"
}, [createBaseVNode("div", {
"class": normalizeClass(["v-slider-thumb__label", backgroundColorClasses.value]),
"style": normalizeStyle(backgroundColorStyles.value)
}, [createBaseVNode("div", null, [slots["thumb-label"]?.({
modelValue: props.modelValue
}) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)]), createBaseVNode("div", {
"class": "v-slider-thumb__label-wedge"
}, null)])]), [[vShow, thumbLabel.value && props.focused || thumbLabel.value === "always"]])]
})]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VSlider/VSliderTrack.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSlider/VSliderTrack.css";
var makeVSliderTrackProps = propsFactory({
start: {
type: Number,
required: true
},
stop: {
type: Number,
required: true
},
...makeComponentProps()
}, "VSliderTrack");
var VSliderTrack = genericComponent()({
name: "VSliderTrack",
props: makeVSliderTrackProps(),
emits: {},
setup(props, _ref) {
let {
slots
} = _ref;
const slider = inject(VSliderSymbol);
if (!slider) throw new Error("[Vuetify] v-slider-track must be inside v-slider or v-range-slider");
const {
color,
parsedTicks,
rounded,
showTicks,
tickSize,
trackColor,
trackFillColor,
trackSize,
vertical,
min,
max,
indexFromEnd
} = slider;
const {
roundedClasses
} = useRounded(rounded);
const {
backgroundColorClasses: trackFillColorClasses,
backgroundColorStyles: trackFillColorStyles
} = useBackgroundColor(trackFillColor);
const {
backgroundColorClasses: trackColorClasses,
backgroundColorStyles: trackColorStyles
} = useBackgroundColor(trackColor);
const startDir = computed(() => `inset-${vertical.value ? "block" : "inline"}-${indexFromEnd.value ? "end" : "start"}`);
const endDir = computed(() => vertical.value ? "height" : "width");
const backgroundStyles = computed(() => {
return {
[startDir.value]: "0%",
[endDir.value]: "100%"
};
});
const trackFillWidth = computed(() => props.stop - props.start);
const trackFillStyles = computed(() => {
return {
[startDir.value]: convertToUnit(props.start, "%"),
[endDir.value]: convertToUnit(trackFillWidth.value, "%")
};
});
const computedTicks = computed(() => {
if (!showTicks.value) return [];
const ticks = vertical.value ? parsedTicks.value.slice().reverse() : parsedTicks.value;
return ticks.map((tick, index) => {
const directionValue = tick.value !== min.value && tick.value !== max.value ? convertToUnit(tick.position, "%") : void 0;
return createBaseVNode("div", {
"key": tick.value,
"class": normalizeClass(["v-slider-track__tick", {
"v-slider-track__tick--filled": tick.position >= props.start && tick.position <= props.stop,
"v-slider-track__tick--first": tick.value === min.value,
"v-slider-track__tick--last": tick.value === max.value
}]),
"style": {
[startDir.value]: directionValue
}
}, [(tick.label || slots["tick-label"]) && createBaseVNode("div", {
"class": "v-slider-track__tick-label"
}, [slots["tick-label"]?.({
tick,
index
}) ?? tick.label])]);
});
});
useRender(() => {
return createBaseVNode("div", {
"class": normalizeClass(["v-slider-track", roundedClasses.value, props.class]),
"style": normalizeStyle([{
"--v-slider-track-size": convertToUnit(trackSize.value),
"--v-slider-tick-size": convertToUnit(tickSize.value)
}, props.style])
}, [createBaseVNode("div", {
"class": normalizeClass(["v-slider-track__background", trackColorClasses.value, {
"v-slider-track__background--opacity": !!color.value || !trackFillColor.value
}]),
"style": {
...backgroundStyles.value,
...trackColorStyles.value
}
}, null), createBaseVNode("div", {
"class": normalizeClass(["v-slider-track__fill", trackFillColorClasses.value]),
"style": {
...trackFillStyles.value,
...trackFillColorStyles.value
}
}, null), showTicks.value && createBaseVNode("div", {
"class": normalizeClass(["v-slider-track__ticks", {
"v-slider-track__ticks--always-show": showTicks.value === "always"
}])
}, [computedTicks.value])]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VSlider/VSlider.js
var makeVSliderProps = propsFactory({
...makeFocusProps(),
...makeSliderProps(),
...makeVInputProps(),
modelValue: {
type: [Number, String],
default: 0
}
}, "VSlider");
var VSlider = genericComponent()({
name: "VSlider",
inheritAttrs: false,
props: makeVSliderProps(),
emits: {
"update:focused": (value) => true,
"update:modelValue": (v) => true,
start: (value) => true,
end: (value) => true
},
setup(props, _ref) {
let {
slots,
emit,
attrs
} = _ref;
const thumbContainerRef = ref();
const inputRef = ref();
const {
rtlClasses
} = useRtl();
const steps = useSteps(props);
const model = useProxiedModel(props, "modelValue", void 0, (value) => {
return steps.roundValue(value == null ? steps.min.value : value);
});
const {
min,
max,
mousePressed,
roundValue,
onSliderMousedown,
onSliderTouchstart,
trackContainerRef,
position,
hasLabels,
disabled,
readonly,
noKeyboard
} = useSlider({
props,
steps,
onSliderStart: () => {
if (!disabled.value && !readonly.value) {
emit("start", model.value);
}
},
onSliderEnd: (_ref2) => {
let {
value
} = _ref2;
const roundedValue = roundValue(value);
if (!disabled.value && !readonly.value) {
model.value = roundedValue;
}
emit("end", roundedValue);
},
onSliderMove: (_ref3) => {
let {
value
} = _ref3;
if (!disabled.value && !readonly.value) {
model.value = roundValue(value);
}
},
getActiveThumb: () => thumbContainerRef.value?.$el
});
const {
isFocused,
focus,
blur
} = useFocus(props);
const trackStop = computed(() => position(model.value));
useRender(() => {
const inputProps = VInput.filterProps(props);
const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
const hasPrepend = !!(props.label || slots.label || slots.prepend);
return createVNode(VInput, mergeProps({
"ref": inputRef,
"class": ["v-slider", {
"v-slider--has-labels": !!slots["tick-label"] || hasLabels.value,
"v-slider--focused": isFocused.value,
"v-slider--pressed": mousePressed.value,
"v-slider--disabled": disabled.value
}, rtlClasses.value, props.class],
"style": props.style
}, inputProps, rootAttrs, {
"focused": isFocused.value
}), {
...slots,
prepend: hasPrepend ? (slotProps) => createBaseVNode(Fragment, null, [slots.label?.(slotProps) ?? (props.label ? createVNode(VLabel, {
"id": slotProps.id.value,
"class": "v-slider__label",
"text": props.label
}, null) : void 0), slots.prepend?.(slotProps)]) : void 0,
default: (_ref4) => {
let {
id,
messagesId
} = _ref4;
return createBaseVNode("div", {
"class": "v-slider__container",
"onMousedown": !readonly.value ? onSliderMousedown : void 0,
"onTouchstartPassive": !readonly.value ? onSliderTouchstart : void 0
}, [createBaseVNode("input", {
"id": id.value,
"name": props.name || id.value,
"disabled": disabled.value,
"readonly": readonly.value,
"tabindex": "-1",
"value": model.value
}, null), createVNode(VSliderTrack, {
"ref": trackContainerRef,
"start": 0,
"stop": trackStop.value
}, {
"tick-label": slots["tick-label"]
}), createVNode(VSliderThumb, mergeProps({
"ref": thumbContainerRef,
"aria-describedby": messagesId.value,
"focused": isFocused.value,
"noKeyboard": noKeyboard.value,
"min": min.value,
"max": max.value,
"modelValue": model.value,
"onUpdate:modelValue": (v) => model.value = v,
"position": trackStop.value,
"elevation": props.elevation,
"onFocus": focus,
"onBlur": blur,
"ripple": props.ripple,
"name": props.name
}, inputAttrs), {
"thumb-label": slots["thumb-label"]
})]);
}
});
});
return forwardRefs({
focus: () => thumbContainerRef.value?.$el.focus()
}, inputRef);
}
});
export {
getOffset,
makeSliderProps,
useSteps,
useSlider,
VSliderThumb,
VSliderTrack,
VSlider
};
//# sourceMappingURL=chunk-WGWEQK64.js.map