Files
personal_development/ServerManagerWebApp/frontend/node_modules/.vite/deps/vuetify_components.js
T
2026-01-09 19:24:41 +00:00

13202 lines
409 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
VCombobox
} from "./chunk-244ON7Z6.js";
import {
VForm
} from "./chunk-5LZQZ6A5.js";
import {
VTextarea
} from "./chunk-T4XKRUDE.js";
import "./chunk-4MMPKXON.js";
import "./chunk-F6LZGKE2.js";
import {
VBottomNavigation
} from "./chunk-LFKLAYDH.js";
import {
VToolbarItems
} from "./chunk-RH43OVWP.js";
import {
VAlert,
VAlertTitle,
makeIconSizeProps,
useIconSizes
} from "./chunk-QMLWKRPM.js";
import {
VExpansionPanel,
VExpansionPanelText,
VExpansionPanelTitle,
VExpansionPanels
} from "./chunk-SCY7DFFY.js";
import {
VSlider,
VSliderThumb,
VSliderTrack,
getOffset,
makeSliderProps,
useSlider,
useSteps
} from "./chunk-WGWEQK64.js";
import {
VSheet,
makeVSheetProps
} from "./chunk-7M5DDQ46.js";
import {
VCard,
VCardActions,
VCardItem,
VCardSubtitle,
VCardText,
VCardTitle
} from "./chunk-3NOJ7Z44.js";
import {
VDataTable,
VDataTableFooter,
VDataTableHeaders,
VDataTableRow,
VDataTableRows,
VDataTableServer,
VDataTableVirtual,
VPagination,
VTable,
createPagination,
createSort,
makeDataTableExpandProps,
makeDataTableGroupProps,
makeDataTablePaginateProps,
makeDataTableSelectProps,
makeDataTableSortProps,
provideExpanded,
provideGroupBy,
providePagination,
provideSelection,
provideSort,
useGroupedItems,
useOptions,
usePaginatedItems,
useSortedItems
} from "./chunk-FCTFWI5H.js";
import {
highlightResult,
makeFilterProps,
useFilter
} from "./chunk-RB6DAYHX.js";
import "./chunk-QV3QXWPM.js";
import {
VSelect,
VVirtualScroll,
makeSelectProps,
useMenuActivator,
useScrolling
} from "./chunk-IZDIYS2S.js";
import {
VTextField,
makeVTextFieldProps
} from "./chunk-6MO6MKTY.js";
import "./chunk-IZQZFEAL.js";
import {
VCheckbox,
VCheckboxBtn
} from "./chunk-6HLLVLOR.js";
import {
VDialog,
makeVDialogProps
} from "./chunk-RWSHRKUK.js";
import {
VFileInput
} from "./chunk-EKMPZMZF.js";
import "./chunk-OI3EYDCB.js";
import {
VCounter,
VField,
VFieldLabel,
makeVFieldProps
} from "./chunk-ITO3JWXJ.js";
import {
VChip,
VChipGroup,
VSlideGroup,
VSlideGroupSymbol,
makeVSlideGroupProps
} from "./chunk-PLNIG6WP.js";
import {
VMenu,
makeVMenuProps
} from "./chunk-LPDOFVDK.js";
import {
VSnackbar,
makeVSnackbarProps
} from "./chunk-CCNWGDBL.js";
import {
VAppBar,
VAppBarNavIcon,
VAppBarTitle
} from "./chunk-P6EQK5CJ.js";
import {
VToolbar,
VToolbarTitle
} from "./chunk-H2QFYTJQ.js";
import {
VCol,
VContainer,
VRow,
VSpacer
} from "./chunk-CMTCIV56.js";
import {
VList,
VListGroup,
VListImg,
VListItem,
VListItemAction,
VListItemMedia,
VListItemSubtitle,
VListItemTitle,
VListSubheader,
makeVListGroupProps,
makeVListItemProps,
makeVListProps,
useItems,
useListItems
} from "./chunk-MQSMF5CI.js";
import {
VAvatar
} from "./chunk-SXI5CS7S.js";
import {
VDivider
} from "./chunk-X3WY3J75.js";
import {
VMain
} from "./chunk-Q5BHIW5H.js";
import {
VNavigationDrawer
} from "./chunk-ZB5S5BI5.js";
import {
VImg,
VResponsive,
makeVImgProps
} from "./chunk-TTIGZHWR.js";
import {
useSsrBoot
} from "./chunk-PCKQGDLK.js";
import {
VBreadcrumbs,
VBreadcrumbsDivider,
VBreadcrumbsItem
} from "./chunk-TN4XZECZ.js";
import {
VSwitch
} from "./chunk-L7BQJLEW.js";
import {
VSelectionControl,
VSelectionControlGroup,
makeSelectionControlGroupProps,
makeVSelectionControlProps
} from "./chunk-KHWE4FHS.js";
import {
VInput,
VLabel,
VMessages,
makeFocusProps,
makeVInputProps,
makeValidationProps,
useFocus,
useInputIcon,
useValidation
} from "./chunk-IK67YVHF.js";
import {
useForm
} from "./chunk-GAYXO4FM.js";
import {
VDialogBottomTransition,
VDialogTopTransition,
VDialogTransition,
VExpandTransition,
VExpandXTransition,
VFabTransition,
VFadeTransition,
VScaleTransition,
VScrollXReverseTransition,
VScrollXTransition,
VScrollYReverseTransition,
VScrollYTransition,
VSlideXReverseTransition,
VSlideXTransition,
VSlideYReverseTransition,
VSlideYTransition
} from "./chunk-B4JFJDWM.js";
import {
createDateRange,
daysDiff,
splitKeyCombination,
splitKeySequence,
useDate
} from "./chunk-WGYWYQOA.js";
import "./chunk-NJV3GUE4.js";
import {
resize_default,
touch_default
} from "./chunk-2AYDXCXT.js";
import {
VTooltip
} from "./chunk-EXUNAYJA.js";
import {
VOverlay,
useHydration
} from "./chunk-CL6G3ICF.js";
import {
makeLazyProps,
useLazy
} from "./chunk-YGX2Z63P.js";
import {
makeDelayProps,
useDelay,
useScopeId
} from "./chunk-BVUPSGRF.js";
import {
intersect_default
} from "./chunk-5ONGSJQ2.js";
import {
forwardRefs
} from "./chunk-GUNW7S2L.js";
import {
MaybeTransition,
makeTransitionProps
} from "./chunk-CAGZXMOS.js";
import {
makeDisplayProps,
useDisplay
} from "./chunk-N4LJHDYD.js";
import {
VApp
} from "./chunk-47GEKY7C.js";
import {
createLayout,
makeLayoutItemProps,
makeLayoutProps,
useLayoutItem
} from "./chunk-KQXZAEJP.js";
import "./chunk-MVBFAXEB.js";
import {
VBtn,
makeVBtnProps
} from "./chunk-UQALH6SL.js";
import {
VBtnGroup,
VBtnToggle
} from "./chunk-5AQLTWWS.js";
import {
makeGroupItemProps,
makeGroupProps,
useGroup,
useGroupItem
} from "./chunk-W6DJL42A.js";
import {
makePositionProps,
usePosition
} from "./chunk-HOEZWRBG.js";
import {
genOverlays,
makeVariantProps,
useVariant
} from "./chunk-ADXDXPPR.js";
import {
makeBorderProps,
useBorder
} from "./chunk-X7YBE6PF.js";
import {
makeElevationProps,
useElevation
} from "./chunk-YJD2PNP6.js";
import "./chunk-GSWLJLRT.js";
import {
VProgressCircular
} from "./chunk-MH76ZJYE.js";
import {
LoaderSlot
} from "./chunk-UXZ55AO7.js";
import {
VProgressLinear
} from "./chunk-6RFSM2OD.js";
import {
useIntersectionObserver
} from "./chunk-AJ7MUB7M.js";
import {
makeLocationProps,
useLocation
} from "./chunk-KTTVT6V2.js";
import {
makeDensityProps,
useDensity
} from "./chunk-TM3MIDYC.js";
import {
VIcon
} from "./chunk-4XZHKYGH.js";
import {
makeSizeProps,
useSize
} from "./chunk-PIT7IT55.js";
import {
makeRoundedProps,
useRounded
} from "./chunk-AQK3CYVW.js";
import {
VDefaultsProvider
} from "./chunk-PAT7NP2Z.js";
import {
makeTagProps
} from "./chunk-2HZIACSB.js";
import {
IconValue,
VClassIcon,
VComponentIcon,
VLigatureIcon,
VSvgIcon
} from "./chunk-OJDZBU5D.js";
import "./chunk-573D4TYC.js";
import {
ripple_default
} from "./chunk-DS4J67XG.js";
import {
computeColor,
useBackgroundColor,
useTextColor
} from "./chunk-BHV5Z34M.js";
import {
makeDimensionProps,
useDimension
} from "./chunk-6EZKHCRW.js";
import {
useResizeObserver
} from "./chunk-XDSAO7OT.js";
import {
provideLocale,
useLocale,
useRtl
} from "./chunk-ENTLCOCZ.js";
import {
useProxiedModel,
useToggleScope
} from "./chunk-KA77II4V.js";
import {
makeThemeProps,
provideTheme,
useTheme
} from "./chunk-3DSR7NCB.js";
import {
EventProp,
HSLtoHSV,
HSVtoCSS,
HSVtoHSL,
HSVtoHex,
HSVtoRGB,
HexToHSV,
IN_BROWSER,
PREFERS_REDUCED_MOTION,
RGBtoCSS,
RGBtoHSV,
SUPPORTS_EYE_DROPPER,
animate,
checkPrintable,
clamp,
consoleWarn,
convertToUnit,
createRange,
createSimpleFunctional,
debounce,
deepEqual,
deepToRaw,
defineComponent,
ensureValidVNode,
escapeForRegex,
extractNumber,
filterInputAttrs,
focusChild,
genericComponent,
getContrast,
getEventCoordinates,
getIndentLines,
getPrefixedEventHandlers,
getPropertyFromItem,
getScrollParent,
has,
isObject,
makeComponentProps,
matchesSelector,
mergeDeep,
noop,
omit,
parseColor,
pick,
pickWithRest,
propsFactory,
provideDefaults,
renderSlot,
standardEasing,
templateRef,
useRender,
wrapInArray
} from "./chunk-LZ5T2ERG.js";
import {
Fragment,
computed,
createBaseVNode,
createTextVNode,
createVNode,
effectScope,
guardReactiveProps,
inject,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onBeforeMount,
onBeforeUnmount,
onMounted,
onScopeDispose,
onUnmounted,
onUpdated,
provide,
reactive,
ref,
shallowRef,
toDisplayString,
toRaw,
toRef,
toRefs,
useId,
vShow,
watch,
watchEffect,
withDirectives
} from "./chunk-2MKFL3BX.js";
// node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.css";
var makeVAutocompleteProps = propsFactory({
autoSelectFirst: {
type: [Boolean, String]
},
clearOnSelect: Boolean,
search: String,
...makeFilterProps({
filterKeys: ["title"]
}),
...makeSelectProps(),
...omit(makeVTextFieldProps({
modelValue: null,
role: "combobox"
}), ["validationValue", "dirty"])
}, "VAutocomplete");
var VAutocomplete = genericComponent()({
name: "VAutocomplete",
props: makeVAutocompleteProps(),
emits: {
"update:focused": (focused) => true,
"update:search": (value) => true,
"update:modelValue": (value) => true,
"update:menu": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
t
} = useLocale();
const vTextFieldRef = ref();
const isFocused = shallowRef(false);
const isPristine = shallowRef(true);
const listHasFocus = shallowRef(false);
const vMenuRef = ref();
const vVirtualScrollRef = ref();
const selectionIndex = shallowRef(-1);
const _searchLock = shallowRef(null);
const {
items,
transformIn,
transformOut
} = useItems(props);
const {
textColorClasses,
textColorStyles
} = useTextColor(() => vTextFieldRef.value?.color);
const {
InputIcon
} = useInputIcon(props);
const search = useProxiedModel(props, "search", "");
const model = useProxiedModel(props, "modelValue", [], (v) => transformIn(v === null ? [null] : wrapInArray(v)), (v) => {
const transformed = transformOut(v);
return props.multiple ? transformed : transformed[0] ?? null;
});
const counterValue = computed(() => {
return typeof props.counterValue === "function" ? props.counterValue(model.value) : typeof props.counterValue === "number" ? props.counterValue : model.value.length;
});
const form = useForm(props);
const {
filteredItems,
getMatches
} = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? "" : search.value));
const displayItems = computed(() => {
if (props.hideSelected && _searchLock.value === null) {
return filteredItems.value.filter((filteredItem) => !model.value.some((s) => s.value === filteredItem.value));
}
return filteredItems.value;
});
const closableChips = toRef(() => props.closableChips && !form.isReadonly.value && !form.isDisabled.value);
const hasChips = computed(() => !!(props.chips || slots.chip));
const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
const selectedValues = computed(() => model.value.map((selection) => selection.props.value));
const firstSelectableItem = computed(() => displayItems.value.find((x) => x.type === "item" && !x.props.disabled));
const highlightFirst = computed(() => {
const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === "exact" && search.value === firstSelectableItem.value?.title;
return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
});
const menuDisabled = computed(() => props.hideNoData && !displayItems.value.length || form.isReadonly.value || form.isDisabled.value);
const _menu = useProxiedModel(props, "menu");
const menu = computed({
get: () => _menu.value,
set: (v) => {
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
if (v && menuDisabled.value) return;
_menu.value = v;
}
});
const {
menuId,
ariaExpanded,
ariaControls
} = useMenuActivator(props, menu);
const listRef = ref();
const listEvents = useScrolling(listRef, vTextFieldRef);
function onClear(e) {
if (props.openOnClear) {
menu.value = true;
}
search.value = "";
}
function onMousedownControl() {
if (menuDisabled.value) return;
menu.value = true;
}
function onMousedownMenuIcon(e) {
if (menuDisabled.value) return;
if (isFocused.value) {
e.preventDefault();
e.stopPropagation();
}
menu.value = !menu.value;
}
function onListKeydown(e) {
if (checkPrintable(e) || e.key === "Backspace") {
vTextFieldRef.value?.focus();
}
}
function onKeydown(e) {
if (form.isReadonly.value) return;
const selectionStart = vTextFieldRef.value?.selectionStart;
const length = model.value.length;
if (["Enter", "ArrowDown", "ArrowUp"].includes(e.key)) {
e.preventDefault();
}
if (["Enter", "ArrowDown"].includes(e.key)) {
menu.value = true;
}
if (["Escape"].includes(e.key)) {
menu.value = false;
}
if (highlightFirst.value && ["Enter", "Tab"].includes(e.key) && firstSelectableItem.value && !model.value.some((_ref2) => {
let {
value
} = _ref2;
return value === firstSelectableItem.value.value;
})) {
select(firstSelectableItem.value);
}
if (e.key === "ArrowDown" && highlightFirst.value) {
listRef.value?.focus("next");
}
if (["Backspace", "Delete"].includes(e.key)) {
if (!props.multiple && hasSelectionSlot.value && model.value.length > 0 && !search.value) return select(model.value[0], false);
if (~selectionIndex.value) {
e.preventDefault();
const originalSelectionIndex = selectionIndex.value;
select(model.value[selectionIndex.value], false);
selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
} else if (e.key === "Backspace" && !search.value) {
selectionIndex.value = length - 1;
}
return;
}
if (!props.multiple) return;
if (e.key === "ArrowLeft") {
if (selectionIndex.value < 0 && selectionStart && selectionStart > 0) return;
const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
if (model.value[prev]) {
selectionIndex.value = prev;
} else {
const searchLength = search.value?.length ?? null;
selectionIndex.value = -1;
vTextFieldRef.value?.setSelectionRange(searchLength, searchLength);
}
} else if (e.key === "ArrowRight") {
if (selectionIndex.value < 0) return;
const next = selectionIndex.value + 1;
if (model.value[next]) {
selectionIndex.value = next;
} else {
selectionIndex.value = -1;
vTextFieldRef.value?.setSelectionRange(0, 0);
}
} else if (~selectionIndex.value && checkPrintable(e)) {
selectionIndex.value = -1;
}
}
function onChange(e) {
if (matchesSelector(vTextFieldRef.value, ":autofill") || matchesSelector(vTextFieldRef.value, ":-webkit-autofill")) {
const item = items.value.find((item2) => item2.title === e.target.value);
if (item) {
select(item);
}
}
}
function onAfterEnter() {
if (props.eager) {
vVirtualScrollRef.value?.calculateVisibleItems();
}
}
function onAfterLeave() {
if (isFocused.value) {
isPristine.value = true;
vTextFieldRef.value?.focus();
}
_searchLock.value = null;
}
function onFocusin(e) {
isFocused.value = true;
setTimeout(() => {
listHasFocus.value = true;
});
}
function onFocusout(e) {
listHasFocus.value = false;
}
function onUpdateModelValue(v) {
if (v == null || v === "" && !props.multiple && !hasSelectionSlot.value) model.value = [];
}
const isSelecting = shallowRef(false);
function select(item) {
let set = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
if (!item || item.props.disabled) return;
if (props.multiple) {
const index = model.value.findIndex((selection) => (props.valueComparator || deepEqual)(selection.value, item.value));
const add = set == null ? !~index : set;
if (~index) {
const value = add ? [...model.value, item] : [...model.value];
value.splice(index, 1);
model.value = value;
} else if (add) {
model.value = [...model.value, item];
}
if (props.clearOnSelect) {
search.value = "";
}
} else {
const add = set !== false;
model.value = add ? [item] : [];
_searchLock.value = isPristine.value ? "" : search.value ?? "";
search.value = add && !hasSelectionSlot.value ? item.title : "";
nextTick(() => {
menu.value = false;
isPristine.value = true;
});
}
}
watch(isFocused, (val, oldVal) => {
if (val === oldVal) return;
if (val) {
isSelecting.value = true;
search.value = props.multiple || hasSelectionSlot.value ? "" : String(model.value.at(-1)?.props.title ?? "");
isPristine.value = true;
nextTick(() => isSelecting.value = false);
} else {
if (!props.multiple && search.value == null) model.value = [];
menu.value = false;
if (!isPristine.value && search.value) {
_searchLock.value = search.value;
}
search.value = "";
selectionIndex.value = -1;
}
});
watch(search, (val) => {
if (!isFocused.value || isSelecting.value) return;
if (val) menu.value = true;
isPristine.value = !val;
});
watch(menu, (val) => {
if (!props.hideSelected && val && model.value.length && isPristine.value) {
const index = displayItems.value.findIndex((item) => model.value.some((s) => item.value === s.value));
IN_BROWSER && window.requestAnimationFrame(() => {
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
});
}
if (val) _searchLock.value = null;
});
watch(items, (newVal, oldVal) => {
if (menu.value) return;
if (isFocused.value && !oldVal.length && newVal.length) {
menu.value = true;
}
});
useRender(() => {
const hasList = !!(!props.hideNoData || displayItems.value.length || slots["prepend-item"] || slots["append-item"] || slots["no-data"]);
const isDirty = model.value.length > 0;
const textFieldProps = VTextField.filterProps(props);
return createVNode(VTextField, mergeProps({
"ref": vTextFieldRef
}, textFieldProps, {
"modelValue": search.value,
"onUpdate:modelValue": [($event) => search.value = $event, onUpdateModelValue],
"focused": isFocused.value,
"onUpdate:focused": ($event) => isFocused.value = $event,
"validationValue": model.externalValue,
"counterValue": counterValue.value,
"dirty": isDirty,
"onChange": onChange,
"class": ["v-autocomplete", `v-autocomplete--${props.multiple ? "multiple" : "single"}`, {
"v-autocomplete--active-menu": menu.value,
"v-autocomplete--chips": !!props.chips,
"v-autocomplete--selection-slot": !!hasSelectionSlot.value,
"v-autocomplete--selecting-index": selectionIndex.value > -1
}, props.class],
"style": props.style,
"readonly": form.isReadonly.value,
"placeholder": isDirty ? void 0 : props.placeholder,
"onClick:clear": onClear,
"onMousedown:control": onMousedownControl,
"onKeydown": onKeydown,
"aria-expanded": ariaExpanded.value,
"aria-controls": ariaControls.value
}), {
...slots,
default: (_ref3) => {
let {
id
} = _ref3;
return createBaseVNode(Fragment, null, [createVNode(VMenu, mergeProps({
"id": menuId.value,
"ref": vMenuRef,
"modelValue": menu.value,
"onUpdate:modelValue": ($event) => menu.value = $event,
"activator": "parent",
"contentClass": "v-autocomplete__content",
"disabled": menuDisabled.value,
"eager": props.eager,
"maxHeight": 310,
"openOnClick": false,
"closeOnContentClick": false,
"onAfterEnter": onAfterEnter,
"onAfterLeave": onAfterLeave
}, props.menuProps), {
default: () => [hasList && createVNode(VList, mergeProps({
"ref": listRef,
"filterable": true,
"selected": selectedValues.value,
"selectStrategy": props.multiple ? "independent" : "single-independent",
"onMousedown": (e) => e.preventDefault(),
"onKeydown": onListKeydown,
"onFocusin": onFocusin,
"onFocusout": onFocusout,
"tabindex": "-1",
"selectable": true,
"aria-live": "polite",
"aria-labelledby": `${id.value}-label`,
"aria-multiselectable": props.multiple,
"color": props.itemColor ?? props.color
}, listEvents, props.listProps), {
default: () => [slots["prepend-item"]?.(), !displayItems.value.length && !props.hideNoData && (slots["no-data"]?.() ?? createVNode(VListItem, {
"key": "no-data",
"title": t(props.noDataText)
}, null)), createVNode(VVirtualScroll, {
"ref": vVirtualScrollRef,
"renderless": true,
"items": displayItems.value,
"itemKey": "value"
}, {
default: (_ref4) => {
let {
item,
index,
itemRef
} = _ref4;
const itemProps = mergeProps(item.props, {
ref: itemRef,
key: item.value,
active: highlightFirst.value && item === firstSelectableItem.value ? true : void 0,
onClick: () => select(item, null),
"aria-posinset": index + 1,
"aria-setsize": displayItems.value.length
});
if (item.type === "divider") {
return slots.divider?.({
props: item.raw,
index
}) ?? createVNode(VDivider, mergeProps(item.props, {
"key": `divider-${index}`
}), null);
}
if (item.type === "subheader") {
return slots.subheader?.({
props: item.raw,
index
}) ?? createVNode(VListSubheader, mergeProps(item.props, {
"key": `subheader-${index}`
}), null);
}
return slots.item?.({
item,
index,
props: itemProps
}) ?? createVNode(VListItem, mergeProps(itemProps, {
"role": "option"
}), {
prepend: (_ref5) => {
let {
isSelected
} = _ref5;
return createBaseVNode(Fragment, null, [props.multiple && !props.hideSelected ? createVNode(VCheckboxBtn, {
"key": item.value,
"modelValue": isSelected,
"ripple": false,
"tabindex": "-1",
"aria-hidden": true,
"onClick": (event) => event.preventDefault()
}, null) : void 0, item.props.prependAvatar && createVNode(VAvatar, {
"image": item.props.prependAvatar
}, null), item.props.prependIcon && createVNode(VIcon, {
"icon": item.props.prependIcon
}, null)]);
},
title: () => {
return isPristine.value ? item.title : highlightResult("v-autocomplete", item.title, getMatches(item)?.title);
}
});
}
}), slots["append-item"]?.()]
})]
}), model.value.map((item, index) => {
function onChipClose(e) {
e.stopPropagation();
e.preventDefault();
select(item, false);
}
const slotProps = mergeProps(VChip.filterProps(item.props), {
"onClick:close": onChipClose,
onKeydown(e) {
if (e.key !== "Enter" && e.key !== " ") return;
e.preventDefault();
e.stopPropagation();
onChipClose(e);
},
onMousedown(e) {
e.preventDefault();
e.stopPropagation();
},
modelValue: true,
"onUpdate:modelValue": void 0
});
const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection;
const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({
item,
index,
props: slotProps
}) : slots.selection({
item,
index
})) : void 0;
if (hasSlot && !slotContent) return void 0;
return createBaseVNode("div", {
"key": item.value,
"class": normalizeClass(["v-autocomplete__selection", index === selectionIndex.value && ["v-autocomplete__selection--selected", textColorClasses.value]]),
"style": normalizeStyle(index === selectionIndex.value ? textColorStyles.value : {})
}, [hasChips.value ? !slots.chip ? createVNode(VChip, mergeProps({
"key": "chip",
"closable": closableChips.value,
"size": "small",
"text": item.title,
"disabled": item.props.disabled
}, slotProps), null) : createVNode(VDefaultsProvider, {
"key": "chip-defaults",
"defaults": {
VChip: {
closable: closableChips.value,
size: "small",
text: item.title
}
}
}, {
default: () => [slotContent]
}) : slotContent ?? createBaseVNode("span", {
"class": "v-autocomplete__selection-text"
}, [item.title, props.multiple && index < model.value.length - 1 && createBaseVNode("span", {
"class": "v-autocomplete__selection-comma"
}, [createTextVNode(",")])])]);
})]);
},
"append-inner": function() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return createBaseVNode(Fragment, null, [slots["append-inner"]?.(...args), props.menuIcon ? createVNode(VIcon, {
"class": "v-autocomplete__menu-icon",
"color": vTextFieldRef.value?.fieldIconColor,
"icon": props.menuIcon,
"onMousedown": onMousedownMenuIcon,
"onClick": noop,
"aria-hidden": true,
"tabindex": "-1"
}, null) : void 0, props.appendInnerIcon && createVNode(InputIcon, {
"key": "append-icon",
"name": "appendInner",
"color": args[0].iconColor.value
}, null)]);
}
});
});
return forwardRefs({
isFocused,
isPristine,
menu,
search,
filteredItems,
select
}, vTextFieldRef);
}
});
// node_modules/vuetify/lib/components/VBadge/VBadge.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VBadge/VBadge.css";
var makeVBadgeProps = propsFactory({
bordered: Boolean,
color: String,
content: [Number, String],
dot: Boolean,
floating: Boolean,
icon: IconValue,
inline: Boolean,
label: {
type: String,
default: "$vuetify.badge"
},
max: [Number, String],
modelValue: {
type: Boolean,
default: true
},
offsetX: [Number, String],
offsetY: [Number, String],
textColor: String,
...makeComponentProps(),
...makeLocationProps({
location: "top end"
}),
...makeRoundedProps(),
...makeTagProps(),
...makeThemeProps(),
...makeTransitionProps({
transition: "scale-rotate-transition"
}),
...makeDimensionProps()
}, "VBadge");
var VBadge = genericComponent()({
name: "VBadge",
inheritAttrs: false,
props: makeVBadgeProps(),
setup(props, ctx) {
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const {
roundedClasses
} = useRounded(props);
const {
t
} = useLocale();
const {
textColorClasses,
textColorStyles
} = useTextColor(() => props.textColor);
const {
themeClasses
} = useTheme();
const {
locationStyles
} = useLocation(props, true, (side) => {
const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
return base + (["top", "bottom"].includes(side) ? Number(props.offsetY ?? 0) : ["left", "right"].includes(side) ? Number(props.offsetX ?? 0) : 0);
});
const {
dimensionStyles
} = useDimension(props);
useRender(() => {
const value = Number(props.content);
const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
const [badgeAttrs, attrs] = pickWithRest(ctx.attrs, ["aria-atomic", "aria-label", "aria-live", "role", "title"]);
return createVNode(props.tag, mergeProps({
"class": ["v-badge", {
"v-badge--bordered": props.bordered,
"v-badge--dot": props.dot,
"v-badge--floating": props.floating,
"v-badge--inline": props.inline
}, props.class]
}, attrs, {
"style": props.style
}), {
default: () => [createBaseVNode("div", {
"class": "v-badge__wrapper"
}, [ctx.slots.default?.(), createVNode(MaybeTransition, {
"transition": props.transition
}, {
default: () => [withDirectives(createBaseVNode("span", mergeProps({
"class": ["v-badge__badge", themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
"style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
"aria-atomic": "true",
"aria-label": t(props.label, value),
"aria-live": "polite",
"role": "status"
}, badgeAttrs), [props.dot ? void 0 : ctx.slots.badge ? ctx.slots.badge?.() : props.icon ? createVNode(VIcon, {
"icon": props.icon
}, null) : content]), [[vShow, props.modelValue]])]
})])]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VBanner/VBanner.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VBanner/VBanner.css";
// node_modules/vuetify/lib/components/VBanner/VBannerActions.js
var makeVBannerActionsProps = propsFactory({
color: String,
density: String,
...makeComponentProps()
}, "VBannerActions");
var VBannerActions = genericComponent()({
name: "VBannerActions",
props: makeVBannerActionsProps(),
setup(props, _ref) {
let {
slots
} = _ref;
provideDefaults({
VBtn: {
color: props.color,
density: props.density,
slim: true,
variant: "text"
}
});
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-banner-actions", props.class]),
"style": normalizeStyle(props.style)
}, [slots.default?.()]));
return {};
}
});
// node_modules/vuetify/lib/components/VBanner/VBannerText.js
var VBannerText = createSimpleFunctional("v-banner-text");
// node_modules/vuetify/lib/components/VBanner/VBanner.js
var makeVBannerProps = propsFactory({
avatar: String,
bgColor: String,
color: String,
icon: IconValue,
lines: String,
stacked: Boolean,
sticky: Boolean,
text: String,
...makeBorderProps(),
...makeComponentProps(),
...makeDensityProps(),
...makeDimensionProps(),
...makeDisplayProps({
mobile: null
}),
...makeElevationProps(),
...makeLocationProps(),
...makePositionProps(),
...makeRoundedProps(),
...makeTagProps(),
...makeThemeProps()
}, "VBanner");
var VBanner = genericComponent()({
name: "VBanner",
props: makeVBannerProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.bgColor);
const {
borderClasses
} = useBorder(props);
const {
densityClasses
} = useDensity(props);
const {
displayClasses,
mobile
} = useDisplay(props);
const {
dimensionStyles
} = useDimension(props);
const {
elevationClasses
} = useElevation(props);
const {
locationStyles
} = useLocation(props);
const {
positionClasses
} = usePosition(props);
const {
roundedClasses
} = useRounded(props);
const {
themeClasses
} = provideTheme(props);
const color = toRef(() => props.color);
const density = toRef(() => props.density);
provideDefaults({
VBannerActions: {
color,
density
}
});
useRender(() => {
const hasText = !!(props.text || slots.text);
const hasPrependMedia = !!(props.avatar || props.icon);
const hasPrepend = !!(hasPrependMedia || slots.prepend);
return createVNode(props.tag, {
"class": normalizeClass(["v-banner", {
"v-banner--stacked": props.stacked || mobile.value,
"v-banner--sticky": props.sticky,
[`v-banner--${props.lines}-line`]: !!props.lines
}, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, displayClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class]),
"style": normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style]),
"role": "banner"
}, {
default: () => [hasPrepend && createBaseVNode("div", {
"key": "prepend",
"class": "v-banner__prepend"
}, [!slots.prepend ? createVNode(VAvatar, {
"key": "prepend-avatar",
"color": color.value,
"density": density.value,
"icon": props.icon,
"image": props.avatar
}, null) : createVNode(VDefaultsProvider, {
"key": "prepend-defaults",
"disabled": !hasPrependMedia,
"defaults": {
VAvatar: {
color: color.value,
density: density.value,
icon: props.icon,
image: props.avatar
}
}
}, slots.prepend)]), createBaseVNode("div", {
"class": "v-banner__content"
}, [hasText && createVNode(VBannerText, {
"key": "text"
}, {
default: () => [slots.text?.() ?? props.text]
}), slots.default?.()]), slots.actions && createVNode(VBannerActions, {
"key": "actions"
}, slots.actions)]
});
});
}
});
// node_modules/vuetify/lib/components/VBottomSheet/VBottomSheet.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VBottomSheet/VBottomSheet.css";
var makeVBottomSheetProps = propsFactory({
inset: Boolean,
...makeVDialogProps({
transition: "bottom-sheet-transition"
})
}, "VBottomSheet");
var VBottomSheet = genericComponent()({
name: "VBottomSheet",
props: makeVBottomSheetProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const isActive = useProxiedModel(props, "modelValue");
useRender(() => {
const dialogProps = VDialog.filterProps(props);
return createVNode(VDialog, mergeProps(dialogProps, {
"contentClass": ["v-bottom-sheet__content", props.contentClass],
"modelValue": isActive.value,
"onUpdate:modelValue": ($event) => isActive.value = $event,
"class": ["v-bottom-sheet", {
"v-bottom-sheet--inset": props.inset
}, props.class],
"style": props.style
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VCalendar/VCalendar.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCalendar/VCalendarCategory.css";
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCalendar/VCalendarDaily.css";
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCalendar/VCalendarWeekly.css";
// node_modules/vuetify/lib/labs/VIconBtn/VIconBtn.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/labs/VIconBtn/VIconBtn.css";
var makeVIconBtnProps = propsFactory({
active: {
type: Boolean,
default: void 0
},
activeColor: String,
activeIcon: [String, Function, Object],
activeVariant: String,
baseVariant: {
type: String,
default: "tonal"
},
disabled: Boolean,
height: [Number, String],
width: [Number, String],
hideOverlay: Boolean,
icon: [String, Function, Object],
iconColor: String,
loading: Boolean,
opacity: [Number, String],
readonly: Boolean,
rotate: [Number, String],
size: {
type: [Number, String],
default: "default"
},
sizes: {
type: Array,
default: () => [["x-small", 16], ["small", 24], ["default", 40], ["large", 48], ["x-large", 56]]
},
text: {
type: [String, Number, Boolean],
default: void 0
},
...makeBorderProps(),
...makeComponentProps(),
...makeElevationProps(),
...makeIconSizeProps(),
...makeRoundedProps(),
...makeTagProps({
tag: "button"
}),
...makeThemeProps(),
...makeVariantProps({
variant: "flat"
})
}, "VIconBtn");
var VIconBtn = genericComponent()({
name: "VIconBtn",
props: makeVIconBtnProps(),
emits: {
"update:active": (value) => true
},
setup(props, _ref) {
let {
attrs,
slots
} = _ref;
const isActive = useProxiedModel(props, "active");
const {
themeClasses
} = provideTheme(props);
const {
borderClasses
} = useBorder(props);
const {
elevationClasses
} = useElevation(props);
const {
roundedClasses
} = useRounded(props);
const {
colorClasses,
colorStyles,
variantClasses
} = useVariant(() => ({
color: (() => {
if (props.disabled) return void 0;
if (!isActive.value) return props.color;
return props.activeColor ?? props.color ?? "surface-variant";
})(),
variant: (() => {
if (isActive.value === void 0) return props.variant;
if (isActive.value) return props.activeVariant ?? props.variant;
return props.baseVariant ?? props.variant;
})()
}));
const btnSizeMap = new Map(props.sizes);
function onClick() {
if (props.disabled || props.readonly || isActive.value === void 0 || props.tag === "a" && attrs.href) return;
isActive.value = !isActive.value;
}
useRender(() => {
const icon = isActive.value ? props.activeIcon ?? props.icon : props.icon;
const _btnSize = props.size;
const hasNamedSize = btnSizeMap.has(_btnSize);
const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
const btnHeight = props.height ?? btnSize;
const btnWidth = props.width ?? btnSize;
const {
iconSize
} = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
const iconProps = {
icon,
size: iconSize.value,
color: props.iconColor,
opacity: props.opacity
};
return createVNode(props.tag, {
"type": props.tag === "button" ? "button" : void 0,
"class": normalizeClass([{
"v-icon-btn": true,
"v-icon-btn--active": isActive.value,
"v-icon-btn--disabled": props.disabled,
"v-icon-btn--loading": props.loading,
"v-icon-btn--readonly": props.readonly,
[`v-icon-btn--${props.size}`]: true
}, themeClasses.value, colorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, variantClasses.value, props.class]),
"style": normalizeStyle([{
"--v-icon-btn-rotate": convertToUnit(props.rotate, "deg"),
"--v-icon-btn-height": convertToUnit(btnHeight),
"--v-icon-btn-width": convertToUnit(btnWidth)
}, colorStyles.value, props.style]),
"tabindex": props.disabled || props.readonly ? -1 : 0,
"onClick": onClick
}, {
default: () => [genOverlays(!props.hideOverlay, "v-icon-btn"), createBaseVNode("div", {
"class": "v-icon-btn__content",
"data-no-activator": ""
}, [!slots.default && icon ? createVNode(VIcon, mergeProps({
"key": "content-icon"
}, iconProps), null) : createVNode(VDefaultsProvider, {
"key": "content-defaults",
"disabled": !icon,
"defaults": {
VIcon: {
...iconProps
}
}
}, {
default: () => slots.default?.() ?? toDisplayString(props.text)
})]), !!props.loading && createBaseVNode("span", {
"key": "loader",
"class": "v-icon-btn__loader"
}, [slots.loader?.() ?? createVNode(VProgressCircular, {
"color": typeof props.loading === "boolean" ? void 0 : props.loading,
"indeterminate": "disable-shrink",
"width": "2",
"size": iconSize.value
}, null)])]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VCalendar/util/dateTimeUtils.js
function isLeapYear(year) {
return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
}
// node_modules/vuetify/lib/components/VCalendar/util/timestamp.js
var PARSE_REGEX = /^(\d{4})-(\d{1,2})(-(\d{1,2}))?([^\d]+(\d{1,2}))?(:(\d{1,2}))?(:(\d{1,2}))?$/;
var PARSE_TIME = /(\d\d?)(:(\d\d?)|)(:(\d\d?)|)/;
var DAYS_IN_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var DAYS_IN_MONTH_LEAP = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var DAYS_IN_MONTH_MIN = 28;
var DAYS_IN_MONTH_MAX = 31;
var MONTH_MAX = 12;
var MONTH_MIN = 1;
var DAY_MIN = 1;
var DAYS_IN_WEEK = 7;
var MINUTES_IN_HOUR = 60;
var MINUTE_MAX = 59;
var MINUTES_IN_DAY = 24 * 60;
var HOURS_IN_DAY = 24;
var HOUR_MAX = 23;
var FIRST_HOUR = 0;
var OFFSET_YEAR = 1e4;
var OFFSET_MONTH = 100;
var OFFSET_HOUR = 100;
var OFFSET_TIME = 1e4;
function getStartOfWeek(timestamp, weekdays, today) {
const start = copyTimestamp(timestamp);
findWeekday(start, weekdays[0], prevDay);
updateFormatted(start);
if (today) {
updateRelative(start, today, start.hasTime);
}
return start;
}
function getEndOfWeek(timestamp, weekdays, today) {
const end = copyTimestamp(timestamp);
findWeekday(end, weekdays[weekdays.length - 1]);
updateFormatted(end);
if (today) {
updateRelative(end, today, end.hasTime);
}
return end;
}
function getStartOfMonth(timestamp) {
const start = copyTimestamp(timestamp);
start.day = DAY_MIN;
updateWeekday(start);
updateFormatted(start);
return start;
}
function getEndOfMonth(timestamp) {
const end = copyTimestamp(timestamp);
end.day = daysInMonth(end.year, end.month);
updateWeekday(end);
updateFormatted(end);
return end;
}
function validateNumber(input) {
return isFinite(parseInt(input));
}
function validateTime(input) {
return typeof input === "number" && isFinite(input) || !!PARSE_TIME.exec(input) || typeof input === "object" && isFinite(input.hour) && isFinite(input.minute);
}
function parseTime(input) {
if (typeof input === "number") {
return input;
} else if (typeof input === "string") {
const parts = PARSE_TIME.exec(input);
if (!parts) {
return false;
}
return parseInt(parts[1]) * 60 + parseInt(parts[3] || 0);
} else if (typeof input === "object") {
if (typeof input.hour !== "number" || typeof input.minute !== "number") {
return false;
}
return input.hour * 60 + input.minute;
} else {
return false;
}
}
function validateTimestamp(input) {
return typeof input === "number" && isFinite(input) || typeof input === "string" && !!PARSE_REGEX.exec(input) || input instanceof Date;
}
function parseTimestamp(input) {
let required = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
let now = arguments.length > 2 ? arguments[2] : void 0;
if (typeof input === "number" && isFinite(input)) {
input = new Date(input);
}
if (input instanceof Date) {
const date = parseDate(input);
if (now) {
updateRelative(date, now, date.hasTime);
}
return date;
}
if (typeof input !== "string") {
if (required) {
throw new Error(`${input} is not a valid timestamp. It must be a Date, number of milliseconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`);
}
return null;
}
const parts = PARSE_REGEX.exec(input);
if (!parts) {
if (required) {
throw new Error(`${input} is not a valid timestamp. It must be a Date, number of milliseconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`);
}
return null;
}
const timestamp = {
date: input,
time: "",
year: parseInt(parts[1]),
month: parseInt(parts[2]),
day: parseInt(parts[4]) || 1,
hour: parseInt(parts[6]) || 0,
minute: parseInt(parts[8]) || 0,
weekday: 0,
hasDay: !!parts[4],
hasTime: !!(parts[6] && parts[8]),
past: false,
present: false,
future: false
};
updateWeekday(timestamp);
updateFormatted(timestamp);
if (now) {
updateRelative(timestamp, now, timestamp.hasTime);
}
return timestamp;
}
function parseDate(date) {
return updateFormatted({
date: "",
time: "",
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate(),
weekday: date.getDay(),
hour: date.getHours(),
minute: date.getMinutes(),
hasDay: true,
hasTime: true,
past: false,
present: true,
future: false
});
}
function getDayIdentifier(timestamp) {
return timestamp.year * OFFSET_YEAR + timestamp.month * OFFSET_MONTH + timestamp.day;
}
function getTimeIdentifier(timestamp) {
return timestamp.hour * OFFSET_HOUR + timestamp.minute;
}
function getTimestampIdentifier(timestamp) {
return getDayIdentifier(timestamp) * OFFSET_TIME + getTimeIdentifier(timestamp);
}
function updateRelative(timestamp, now) {
let time = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
let a = getDayIdentifier(now);
let b = getDayIdentifier(timestamp);
let present = a === b;
if (timestamp.hasTime && time && present) {
a = getTimeIdentifier(now);
b = getTimeIdentifier(timestamp);
present = a === b;
}
timestamp.past = b < a;
timestamp.present = present;
timestamp.future = b > a;
return timestamp;
}
function isTimedless(input) {
return input instanceof Date || typeof input === "number" && isFinite(input);
}
function updateHasTime(timestamp, hasTime, now) {
if (timestamp.hasTime !== hasTime) {
timestamp.hasTime = hasTime;
if (!hasTime) {
timestamp.hour = HOUR_MAX;
timestamp.minute = MINUTE_MAX;
timestamp.time = getTime(timestamp);
}
if (now) {
updateRelative(timestamp, now, timestamp.hasTime);
}
}
return timestamp;
}
function updateMinutes(timestamp, minutes, now) {
timestamp.hasTime = true;
timestamp.hour = 0;
timestamp.minute = 0;
nextMinutes(timestamp, minutes);
updateFormatted(timestamp);
if (now) {
updateRelative(timestamp, now, true);
}
return timestamp;
}
function updateWeekday(timestamp) {
timestamp.weekday = getWeekday(timestamp);
return timestamp;
}
function updateFormatted(timestamp) {
timestamp.time = getTime(timestamp);
timestamp.date = getDate(timestamp);
return timestamp;
}
function getWeekday(timestamp) {
if (timestamp.hasDay) {
const _ = Math.floor;
const k = timestamp.day;
const m = (timestamp.month + 9) % MONTH_MAX + 1;
const C = _(timestamp.year / 100);
const Y = timestamp.year % 100 - (timestamp.month <= 2 ? 1 : 0);
return ((k + _(2.6 * m - 0.2) - 2 * C + Y + _(Y / 4) + _(C / 4)) % 7 + 7) % 7;
}
return timestamp.weekday;
}
function daysInMonth(year, month) {
return isLeapYear(year) ? DAYS_IN_MONTH_LEAP[month] : DAYS_IN_MONTH[month];
}
function copyTimestamp(timestamp) {
if (timestamp == null) return null;
const {
date,
time,
year,
month,
day,
weekday,
hour,
minute,
hasDay,
hasTime,
past,
present,
future
} = timestamp;
return {
date,
time,
year,
month,
day,
weekday,
hour,
minute,
hasDay,
hasTime,
past,
present,
future
};
}
function padNumber(x, length) {
let padded = String(x);
while (padded.length < length) {
padded = "0" + padded;
}
return padded;
}
function getDate(timestamp) {
let str = `${padNumber(timestamp.year, 4)}-${padNumber(timestamp.month, 2)}`;
if (timestamp.hasDay) str += `-${padNumber(timestamp.day, 2)}`;
return str;
}
function getTime(timestamp) {
if (!timestamp.hasTime) {
return "";
}
return `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`;
}
function nextMinutes(timestamp, minutes) {
timestamp.minute += minutes;
while (timestamp.minute >= MINUTES_IN_HOUR) {
timestamp.minute -= MINUTES_IN_HOUR;
timestamp.hour++;
if (timestamp.hour >= HOURS_IN_DAY) {
nextDay(timestamp);
timestamp.hour = FIRST_HOUR;
}
}
return timestamp;
}
function nextDay(timestamp) {
timestamp.day++;
timestamp.weekday = (timestamp.weekday + 1) % DAYS_IN_WEEK;
if (timestamp.day > DAYS_IN_MONTH_MIN && timestamp.day > daysInMonth(timestamp.year, timestamp.month)) {
timestamp.day = DAY_MIN;
timestamp.month++;
if (timestamp.month > MONTH_MAX) {
timestamp.month = MONTH_MIN;
timestamp.year++;
}
}
return timestamp;
}
function prevDay(timestamp) {
timestamp.day--;
timestamp.weekday = (timestamp.weekday + 6) % DAYS_IN_WEEK;
if (timestamp.day < DAY_MIN) {
timestamp.month--;
if (timestamp.month < MONTH_MIN) {
timestamp.year--;
timestamp.month = MONTH_MAX;
}
timestamp.day = daysInMonth(timestamp.year, timestamp.month);
}
return timestamp;
}
function relativeDays(timestamp) {
let mover = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : nextDay;
let days = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 1;
while (--days >= 0) mover(timestamp);
return timestamp;
}
function diffMinutes(min, max) {
const Y = (max.year - min.year) * 525600;
const M = (max.month - min.month) * 43800;
const D = (max.day - min.day) * 1440;
const h = (max.hour - min.hour) * 60;
const m = max.minute - min.minute;
return Y + M + D + h + m;
}
function findWeekday(timestamp, weekday) {
let mover = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : nextDay;
let maxDays = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 6;
while (timestamp.weekday !== weekday && --maxDays >= 0) mover(timestamp);
return timestamp;
}
function getWeekdaySkips(weekdays) {
const skips = [1, 1, 1, 1, 1, 1, 1];
const filled = [0, 0, 0, 0, 0, 0, 0];
for (let i = 0; i < weekdays.length; i++) {
filled[weekdays[i]] = 1;
}
for (let k = 0; k < DAYS_IN_WEEK; k++) {
let skip = 1;
for (let j = 1; j < DAYS_IN_WEEK; j++) {
const next = (k + j) % DAYS_IN_WEEK;
if (filled[next]) {
break;
}
skip++;
}
skips[k] = filled[k] * skip;
}
return skips;
}
function timestampToDate(timestamp) {
const time = `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`;
const date = timestamp.date;
return /* @__PURE__ */ new Date(`${date}T${time}:00+00:00`);
}
function createDayList(start, end, now, weekdaySkips) {
let max = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : 42;
let min = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : 0;
const stop = getDayIdentifier(end);
const days = [];
let current = copyTimestamp(start);
let currentIdentifier = 0;
let stopped = currentIdentifier === stop;
if (stop < getDayIdentifier(start)) {
throw new Error("End date is earlier than start date.");
}
while ((!stopped || days.length < min) && days.length < max) {
currentIdentifier = getDayIdentifier(current);
stopped = stopped || currentIdentifier === stop;
if (weekdaySkips[current.weekday] === 0) {
current = nextDay(current);
continue;
}
const day = copyTimestamp(current);
updateFormatted(day);
updateRelative(day, now);
days.push(day);
current = relativeDays(current, nextDay, weekdaySkips[current.weekday]);
}
if (!days.length) throw new Error("No dates found using specified start date, end date, and weekdays.");
return days;
}
function createIntervalList(timestamp, first, minutes, count, now) {
const intervals = [];
for (let i = 0; i < count; i++) {
const mins = first + i * minutes;
const int2 = copyTimestamp(timestamp);
intervals.push(updateMinutes(int2, mins, now));
}
return intervals;
}
function createNativeLocaleFormatter(locale, getOptions) {
const emptyFormatter = (_t, _s) => "";
if (typeof Intl === "undefined" || typeof Intl.DateTimeFormat === "undefined") {
return emptyFormatter;
}
return (timestamp, short) => {
try {
const intlFormatter = new Intl.DateTimeFormat(locale || void 0, getOptions(timestamp, short));
return intlFormatter.format(timestampToDate(timestamp));
} catch (e) {
return "";
}
};
}
function validateWeekdays(input) {
if (typeof input === "string") {
input = input.split(",");
}
if (Array.isArray(input)) {
const ints = input.map((x) => parseInt(x));
if (ints.length > DAYS_IN_WEEK || ints.length === 0) {
return false;
}
const visited = {};
let wrapped = false;
for (let i = 0; i < ints.length; i++) {
const x = ints[i];
if (!isFinite(x) || x < 0 || x >= DAYS_IN_WEEK) {
return false;
}
if (i > 0) {
const d = x - ints[i - 1];
if (d < 0) {
if (wrapped) {
return false;
}
wrapped = true;
} else if (d === 0) {
return false;
}
}
if (visited[x]) {
return false;
}
visited[x] = true;
}
return true;
}
return false;
}
// node_modules/vuetify/lib/components/VCalendar/composables/times.js
function useTimes(props) {
const times = reactive({
now: parseTimestamp("0000-00-00 00:00", true),
today: parseTimestamp("0000-00-00", true)
});
const parsedNow = computed(() => {
return props.now && validateTimestamp(props.now) ? parseTimestamp(props.now, true) : null;
});
function setPresent() {
times.now.present = times.today.present = true;
times.now.past = times.today.past = false;
times.now.future = times.today.future = false;
}
function getNow() {
return parseDate(/* @__PURE__ */ new Date());
}
function updateDay(now, target) {
if (now.date !== target.date) {
target.year = now.year;
target.month = now.month;
target.day = now.day;
target.weekday = now.weekday;
target.date = now.date;
}
}
function updateTime(now, target) {
if (now.time !== target.time) {
target.hour = now.hour;
target.minute = now.minute;
target.time = now.time;
}
}
function updateTimes() {
const now = parsedNow.value || getNow();
updateDay(now, times.now);
updateTime(now, times.now);
updateDay(now, times.today);
}
watch(parsedNow, updateTimes);
updateTimes();
setPresent();
return {
times,
parsedNow,
updateTimes,
setPresent,
getNow,
updateDay,
updateTime
};
}
// node_modules/vuetify/lib/components/VCalendar/composables/calendarBase.js
var makeCalendarBaseProps = propsFactory({
start: {
type: [String, Number, Date],
validate: validateTimestamp,
default: () => parseDate(/* @__PURE__ */ new Date()).date
},
end: {
type: [String, Number, Date],
validate: validateTimestamp
},
weekdays: {
type: [Array, String],
default: () => [0, 1, 2, 3, 4, 5, 6],
validate: validateWeekdays
},
firstDayOfWeek: [Number, String],
firstDayOfYear: [Number, String],
weekdayFormat: {
type: Function,
default: null
},
dayFormat: {
type: Function,
default: null
},
locale: String,
now: {
type: String,
validator: validateTimestamp
},
type: {
type: String,
default: "month"
}
}, "VCalendar-base");
function useCalendarBase(props) {
const {
times,
updateTimes
} = useTimes({
now: props.now
});
const locale = provideLocale(props);
const adapter = useDate();
const parsedStart = computed(() => {
if (props.type === "month") {
return getStartOfMonth(parseTimestamp(props.start, true));
}
return parseTimestamp(props.start, true);
});
const parsedEnd = computed(() => {
const start = parsedStart.value;
const end = props.end ? parseTimestamp(props.end) || start : start;
const value = getTimestampIdentifier(end) < getTimestampIdentifier(start) ? start : end;
if (props.type === "month") {
return getEndOfMonth(value);
}
return value;
});
const parsedValue = computed(() => {
return validateTimestamp(props.modelValue) ? parseTimestamp(props.modelValue, true) : parsedStart.value || times.today;
});
const parsedWeekdays = computed(() => {
const weekdays = Array.isArray(props.weekdays) ? props.weekdays : (props.weekdays || "").split(",").map((x) => parseInt(x, 10));
const first = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
return [...weekdays.toSorted().filter((v) => v >= first), ...weekdays.toSorted().filter((v) => v < first)];
});
const effectiveWeekdays = computed(() => {
const start = parsedValue.value;
const days2 = parseInt(String(props.categoryDays)) || 1;
switch (props.type) {
case "day":
return [start.weekday];
case "4day":
return [start.weekday, (start.weekday + 1) % 7, (start.weekday + 2) % 7, (start.weekday + 3) % 7];
case "category":
return Array.from({
length: days2
}, (_, i) => (start.weekday + i) % 7);
default:
return parsedWeekdays.value;
}
});
const weekdaySkips = computed(() => {
return getWeekdaySkips(parsedWeekdays.value);
});
const days = computed(() => {
return createDayList(parsedStart.value, parsedEnd.value, times.today, weekdaySkips.value);
});
const dayFormatter = computed(() => {
if (props.dayFormat) {
return props.dayFormat;
}
return createNativeLocaleFormatter(locale.current.value, () => ({
timeZone: "UTC",
day: "numeric"
}));
});
const weekdayFormatter = computed(() => {
if (props.weekdayFormat) {
return props.weekdayFormat;
}
return createNativeLocaleFormatter(locale.current.value, (_tms, short) => ({
timeZone: "UTC",
weekday: short ? "short" : "long"
}));
});
function getColorProps(colors) {
return computeColor(colors);
}
function getRelativeClasses(timestamp) {
let outside = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return {
"v-present": timestamp.present,
"v-past": timestamp.past,
"v-future": timestamp.future,
"v-outside": outside
};
}
function getWeekNumber(timestamp) {
return adapter.getWeek(adapter.date(timestamp.date), props.firstDayOfWeek, props.firstDayOfYear);
}
function _getStartOfWeek(timestamp) {
return getStartOfWeek(timestamp, parsedWeekdays.value, times.today);
}
function _getEndOfWeek(timestamp) {
return getEndOfWeek(timestamp, parsedWeekdays.value, times.today);
}
function getFormatter(options) {
return createNativeLocaleFormatter(locale.current.value, () => options);
}
return {
times,
locale,
parsedValue,
parsedWeekdays,
effectiveWeekdays,
weekdaySkips,
parsedStart,
parsedEnd,
days,
dayFormatter,
weekdayFormatter,
getColorProps,
getRelativeClasses,
getWeekNumber,
getStartOfWeek: _getStartOfWeek,
getEndOfWeek: _getEndOfWeek,
getFormatter,
updateTimes
};
}
// node_modules/vuetify/lib/components/VCalendar/composables/calendarWithIntervals.js
var makeCalendarWithIntervalsProps = propsFactory({
maxDays: {
type: Number,
default: 7
},
intervalHeight: {
type: [Number, String],
default: 48,
validate: validateNumber
},
intervalWidth: {
type: [Number, String],
default: 60,
validate: validateNumber
},
intervalMinutes: {
type: [Number, String],
default: 60,
validate: validateNumber
},
firstInterval: {
type: [Number, String],
default: 0,
validate: validateNumber
},
firstTime: {
type: [Number, String, Object],
validate: validateTime
},
intervalCount: {
type: [Number, String],
default: 24,
validate: validateNumber
},
intervalFormat: {
type: Function,
default: null
},
intervalStyle: {
type: Function,
default: null
},
showIntervalLabel: {
type: Function,
default: null
}
}, "VCalendar-intervals");
function useCalendarWithIntervals(props) {
const base = useCalendarBase(props);
const scrollAreaRef = shallowRef();
const parsedFirstInterval = computed(() => {
return parseInt(String(props.firstInterval || 0));
});
const parsedIntervalMinutes = computed(() => {
return parseInt(String(props.intervalMinutes || 60));
});
const parsedIntervalCount = computed(() => {
return parseInt(String(props.intervalCount || 24));
});
const parsedIntervalHeight = computed(() => {
return parseFloat(String(props.intervalHeight || 48));
});
const parsedFirstTime = computed(() => {
return parseTime(props.firstTime);
});
const firstMinute = computed(() => {
const time = parsedFirstTime.value;
return time !== false && time >= 0 && time <= MINUTES_IN_DAY ? time : parsedFirstInterval.value * parsedIntervalMinutes.value;
});
const bodyHeight = computed(() => {
return parsedIntervalCount.value * parsedIntervalHeight.value;
});
const days = computed(() => {
return createDayList(base.parsedStart.value, base.parsedEnd.value, base.times.today, base.weekdaySkips.value, props.maxDays);
});
const intervals = computed(() => {
const daysValue = days.value;
const first = firstMinute.value;
const minutes = parsedIntervalMinutes.value;
const count = parsedIntervalCount.value;
const now = base.times.now;
return daysValue.map((d) => createIntervalList(d, first, minutes, count, now));
});
const intervalFormatter = computed(() => {
if (props.intervalFormat) {
return props.intervalFormat;
}
return createNativeLocaleFormatter(base.locale.current.value, (tms, short) => !short ? {
timeZone: "UTC",
hour: "2-digit",
minute: "2-digit"
} : tms.minute === 0 ? {
timeZone: "UTC",
hour: "numeric"
} : {
timeZone: "UTC",
hour: "numeric",
minute: "2-digit"
});
});
function showIntervalLabelDefault(interval) {
const first = intervals.value[0][0];
const isFirst = first.hour === interval.hour && first.minute === interval.minute;
return !isFirst;
}
function intervalStyleDefault(_interval) {
return void 0;
}
function getTimestampAtEvent(e, day) {
const timestamp = copyTimestamp(day);
const bounds = e.currentTarget.getBoundingClientRect();
const baseMinutes = firstMinute.value;
const touchEvent = e;
const mouseEvent = e;
const touches = touchEvent.changedTouches || touchEvent.touches;
const clientY = touches && touches[0] ? touches[0].clientY : mouseEvent.clientY;
const addIntervals = (clientY - bounds.top) / parsedIntervalHeight.value;
const addMinutes = Math.floor(addIntervals * parsedIntervalMinutes.value);
const minutes = baseMinutes + addMinutes;
return updateMinutes(timestamp, minutes, base.times.now);
}
function getSlotScope(timestamp) {
const scope = copyTimestamp(timestamp);
scope.timeToY = timeToY;
scope.timeDelta = timeDelta;
scope.minutesToPixels = minutesToPixels;
scope.week = days.value;
scope.intervalRange = [firstMinute.value, firstMinute.value + parsedIntervalCount.value * parsedIntervalMinutes.value];
return scope;
}
function scrollToTime(time) {
const y = timeToY(time);
const pane = scrollAreaRef.value;
if (y === false || !pane) {
return false;
}
pane.scrollTop = y;
return true;
}
function minutesToPixels(minutes) {
return minutes / parsedIntervalMinutes.value * parsedIntervalHeight.value;
}
function timeToY(time) {
let targetDateOrClamp = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
const clamp2 = targetDateOrClamp !== false;
const targetDate = typeof targetDateOrClamp !== "boolean" ? targetDateOrClamp : void 0;
let y = timeDelta(time, targetDate);
if (y === false) return y;
y *= bodyHeight.value;
if (clamp2) {
if (y < 0) {
y = 0;
} else if (y > bodyHeight.value) {
y = bodyHeight.value;
}
} else {
if (y < 0) {
y = y + bodyHeight.value;
} else if (y > bodyHeight.value) {
y = y - bodyHeight.value;
}
}
return y;
}
function timeDelta(time, targetDate) {
let minutes = parseTime(time);
if (minutes === false) {
return false;
}
const gap = parsedIntervalCount.value * parsedIntervalMinutes.value;
if (targetDate && typeof time === "object" && "day" in time) {
const a = getDayIdentifier(time);
const b = getDayIdentifier(targetDate);
minutes += (a - b) * gap;
}
const min = firstMinute.value;
return (minutes - min) / gap;
}
return {
...base,
scrollAreaRef,
parsedFirstInterval,
parsedIntervalMinutes,
parsedIntervalCount,
parsedIntervalHeight,
parsedFirstTime,
firstMinute,
bodyHeight,
days,
intervals,
intervalFormatter,
showIntervalLabelDefault,
intervalStyleDefault,
getTimestampAtEvent,
getSlotScope,
scrollToTime,
minutesToPixels,
timeToY,
timeDelta
};
}
// node_modules/vuetify/lib/components/VCalendar/VCalendarDaily.js
var VCalendarDaily = defineComponent({
name: "VCalendarDaily",
directives: {
vResize: resize_default
},
props: {
color: String,
shortWeekdays: {
type: Boolean,
default: true
},
shortIntervals: {
type: Boolean,
default: true
},
hideHeader: Boolean,
...makeCalendarBaseProps(),
...makeCalendarWithIntervalsProps()
},
setup(props, _ref) {
let {
slots,
attrs
} = _ref;
const scrollPush = ref(0);
const pane = ref();
const base = useCalendarWithIntervals(props);
function init() {
nextTick(onResize);
}
function onResize() {
scrollPush.value = getScrollPush();
}
function getScrollPush() {
return base.scrollAreaRef.value && pane.value ? base.scrollAreaRef.value.offsetWidth - pane.value.offsetWidth : 0;
}
function genHead() {
return createBaseVNode("div", {
"class": "v-calendar-daily__head",
"style": {
marginRight: scrollPush.value + "px"
}
}, [genHeadIntervals(), genHeadDays()]);
}
function genHeadIntervals() {
const width = convertToUnit(props.intervalWidth);
return createBaseVNode("div", {
"class": "v-calendar-daily__intervals-head",
"style": {
width
}
}, [slots["interval-header"]?.()]);
}
function genHeadDays() {
return base.days.value.map(genHeadDay);
}
function genHeadDay(day, index) {
const events = getPrefixedEventHandlers(attrs, ":day", (nativeEvent) => ({
nativeEvent,
...base.getSlotScope(day)
}));
return createBaseVNode("div", mergeProps({
"key": day.date,
"class": ["v-calendar-daily_head-day", base.getRelativeClasses(day)]
}, events), [genHeadWeekday(day), genHeadDayLabel(day), genDayHeader(day, index)]);
}
function genDayHeader(day, index) {
return slots["day-header"]?.({
week: base.days.value,
...day,
index
}) ?? [];
}
function genHeadWeekday(day) {
const color = day.present ? props.color : void 0;
return createBaseVNode("div", mergeProps(base.getColorProps({
text: color
}), {
"class": "v-calendar-daily_head-weekday"
}), [base.weekdayFormatter.value(day, props.shortWeekdays)]);
}
function genHeadDayLabel(day) {
return createBaseVNode("div", {
"class": "v-calendar-daily_head-day-label"
}, [slots["day-label-header"]?.(day) ?? genHeadDayButton(day)]);
}
function genHeadDayButton(day) {
const events = getPrefixedEventHandlers(attrs, ":date", (nativeEvent) => ({
nativeEvent,
...day
}));
return createVNode(VIconBtn, mergeProps({
"active": day.present,
"activeColor": props.color,
"variant": "outlined",
"baseVariant": "text",
"onUpdate:active": noop
}, events), {
default: () => [base.dayFormatter.value(day, false)]
});
}
function genBody() {
return createBaseVNode("div", {
"class": "v-calendar-daily__body"
}, [genScrollArea()]);
}
function genScrollArea() {
return createBaseVNode("div", {
"ref": base.scrollAreaRef,
"class": "v-calendar-daily__scroll-area"
}, [genPane()]);
}
function genPane() {
return createBaseVNode("div", {
"ref": pane,
"class": "v-calendar-daily__pane",
"style": {
height: convertToUnit(base.bodyHeight.value)
}
}, [genDayContainer()]);
}
function genDayContainer() {
return createBaseVNode("div", {
"class": "v-calendar-daily__day-container"
}, [genBodyIntervals(), slots.days?.() ?? genDays()]);
}
function genDays() {
return base.days.value.map((day, index) => {
const events = getPrefixedEventHandlers(attrs, ":time", (nativeEvent) => ({
nativeEvent,
...base.getSlotScope(base.getTimestampAtEvent(nativeEvent, day))
}));
return createBaseVNode("div", mergeProps({
"key": day.date,
"class": ["v-calendar-daily__day", base.getRelativeClasses(day)]
}, events), [genDayIntervals(index), genDayBody(day)]);
});
}
function genDayBody(day) {
return slots["day-body"]?.(base.getSlotScope(day)) ?? [];
}
function genDayIntervals(index) {
return base.intervals.value[index].map(genDayInterval);
}
function genDayInterval(interval) {
const height = convertToUnit(props.intervalHeight);
const styler = props.intervalStyle || base.intervalStyleDefault;
return createBaseVNode("div", {
"class": "v-calendar-daily__day-interval",
"key": interval.time,
"style": normalizeStyle([{
height
}, styler(interval)])
}, [slots.interval?.(base.getSlotScope(interval))]);
}
function genBodyIntervals() {
const width = convertToUnit(props.intervalWidth);
const events = getPrefixedEventHandlers(attrs, ":interval", (nativeEvent) => ({
nativeEvent,
...base.getTimestampAtEvent(nativeEvent, base.parsedStart.value)
}));
return createBaseVNode("div", mergeProps({
"class": "v-calendar-daily__intervals-body",
"style": {
width
}
}, events), [genIntervalLabels()]);
}
function genIntervalLabels() {
if (!base.intervals.value.length) return null;
return base.intervals.value[0].map(genIntervalLabel);
}
function genIntervalLabel(interval) {
const height = convertToUnit(props.intervalHeight);
const short = props.shortIntervals;
const shower = props.showIntervalLabel || base.showIntervalLabelDefault;
const show = shower(interval);
const label = show ? base.intervalFormatter.value(interval, short) : void 0;
return createBaseVNode("div", {
"key": interval.time,
"class": "v-calendar-daily__interval",
"style": {
height
}
}, [createBaseVNode("div", {
"class": "v-calendar-daily__interval-text"
}, [label])]);
}
onMounted(init);
useRender(() => withDirectives(createBaseVNode("div", {
"class": normalizeClass(["v-calendar-daily", attrs.class]),
"onDragstart": (e) => e.preventDefault()
}, [!props.hideHeader ? genHead() : void 0, genBody()]), [[resize_default, onResize, void 0, {
quiet: true
}]]));
return {
...base,
scrollPush,
pane,
init,
onResize,
getScrollPush
};
}
});
// node_modules/vuetify/lib/components/VCalendar/util/parser.js
function parsedCategoryText(category, categoryText) {
return typeof categoryText === "function" ? categoryText(category) : typeof categoryText === "string" && typeof category === "object" && category ? category[categoryText] : typeof category === "string" ? category : "";
}
function getParsedCategories(categories, categoryText) {
if (typeof categories === "string") return categories.split(/\s*,\s/);
if (Array.isArray(categories)) {
return categories.map((category) => {
if (typeof category === "string") return category;
const categoryName = typeof category.categoryName === "string" ? category.categoryName : parsedCategoryText(category, categoryText);
return {
...category,
categoryName
};
});
}
return [];
}
// node_modules/vuetify/lib/components/VCalendar/VCalendarCategory.js
var VCalendarCategory = defineComponent({
name: "VCalendarCategory",
props: {
categories: {
type: [Array, String],
default: ""
},
categoryText: [String, Function],
categoryForInvalid: {
type: String,
default: ""
},
...makeCalendarBaseProps(),
...makeCalendarWithIntervalsProps()
},
setup(props, _ref) {
let {
slots,
attrs
} = _ref;
const base = useCalendarWithIntervals(props);
const parsedCategories = computed(() => {
return getParsedCategories(props.categories, props.categoryText);
});
function getCategoryScope(scope, category) {
const cat = typeof category === "object" && category && category.categoryName === props.categoryForInvalid ? null : category;
return {
...scope,
category: cat
};
}
function genDayHeader(scope) {
return createBaseVNode("div", {
"class": "v-calendar-category__columns"
}, [parsedCategories.value.map((category) => {
return genDayHeaderCategory(scope, getCategoryScope(scope, category));
})]);
}
function genDayHeaderCategory(day, scope) {
const headerTitle = typeof scope.category === "object" ? scope.category.categoryName : scope.category;
const events = getPrefixedEventHandlers(attrs, ":dayCategory", () => {
return getCategoryScope(base.getSlotScope(day) || day, scope.category);
});
return createBaseVNode("div", mergeProps({
"class": "v-calendar-category__column-header"
}, events), [slots.category?.(scope) ?? genDayHeaderCategoryTitle(headerTitle), slots["day-header"]?.(scope)]);
}
function genDayHeaderCategoryTitle(categoryName) {
return createBaseVNode("div", {
"class": "v-calendar-category__category"
}, [categoryName === null ? props.categoryForInvalid : categoryName]);
}
function genDays() {
const days = [];
base.days.value.forEach((d, j) => {
const day = new Array(parsedCategories.value.length || 1);
day.fill(d);
days.push(...day.map((v, i) => genDay(v, j, i)));
});
return days;
}
function genDay(day, index, categoryIndex) {
const category = parsedCategories.value[categoryIndex];
const events = getPrefixedEventHandlers(attrs, ":time", (e) => {
return base.getSlotScope(base.getTimestampAtEvent(e, day));
});
return createBaseVNode("div", mergeProps({
"key": day.date + "-" + categoryIndex,
"class": ["v-calendar-daily__day", base.getRelativeClasses(day)]
}, events), [genDayIntervals(index, category), genDayBody(day, category)]);
}
function genDayIntervals(index, category) {
return base.intervals.value[index].map((v) => genDayInterval(v, category));
}
function genDayInterval(interval, category) {
const height = convertToUnit(props.intervalHeight);
const styler = props.intervalStyle || base.intervalStyleDefault;
return createBaseVNode("div", {
"key": interval.time,
"class": "v-calendar-daily__day-interval",
"style": normalizeStyle([{
height
}, styler({
...interval,
category
})])
}, [slots.interval?.(getCategoryScope(base.getSlotScope(interval), category))]);
}
function genDayBody(day, category) {
return createBaseVNode("div", {
"class": "v-calendar-category__columns"
}, [genDayBodyCategory(day, category)]);
}
function genDayBodyCategory(day, category) {
const events = getPrefixedEventHandlers(attrs, ":timeCategory", (e) => {
return getCategoryScope(base.getSlotScope(base.getTimestampAtEvent(e, day)), category);
});
return createBaseVNode("div", mergeProps({
"class": "v-calendar-category__column"
}, events), [slots["day-body"]?.(getCategoryScope(base.getSlotScope(day), category))]);
}
useRender(() => createVNode(VCalendarDaily, mergeProps({
"class": ["v-calendar-daily", "v-calendar-category"]
}, props), {
...slots,
days: genDays,
"day-header": genDayHeader
}));
return {
...base,
parsedCategories
};
}
});
// node_modules/vuetify/lib/components/VCalendar/VCalendarWeekly.js
var VCalendarWeekly = defineComponent({
name: "VCalendarWeekly",
props: {
minWeeks: {
validate: validateNumber,
default: 1
},
monthFormat: Function,
showWeek: Boolean,
color: String,
shortWeekdays: {
type: Boolean,
default: true
},
showMonthOnFirst: {
type: Boolean,
default: true
},
shortMonths: {
type: Boolean,
default: true
},
hideHeader: Boolean,
...makeCalendarBaseProps()
},
setup(props, _ref) {
let {
slots,
attrs
} = _ref;
const base = useCalendarBase(props);
const theme = useTheme();
const parsedMinWeeks = computed(() => {
return parseInt(String(props.minWeeks));
});
const days = computed(() => {
const minDays = parsedMinWeeks.value * base.parsedWeekdays.value.length;
const start = base.getStartOfWeek(base.parsedStart.value);
const end = base.getEndOfWeek(base.parsedEnd.value);
return createDayList(start, end, base.times.today, base.weekdaySkips.value, Number.MAX_SAFE_INTEGER, minDays);
});
const todayWeek = computed(() => {
const today = base.times.today;
const start = base.getStartOfWeek(today);
const end = base.getEndOfWeek(today);
return createDayList(start, end, today, base.weekdaySkips.value, base.parsedWeekdays.value.length, base.parsedWeekdays.value.length);
});
const monthFormatter = computed(() => {
if (props.monthFormat) {
return props.monthFormat;
}
return createNativeLocaleFormatter(base.locale.current.value, (_tms, short) => ({
timeZone: "UTC",
month: short ? "short" : "long"
}));
});
function isOutside(day) {
const dayIdentifier = getDayIdentifier(day);
return dayIdentifier < getDayIdentifier(base.parsedStart.value) || dayIdentifier > getDayIdentifier(base.parsedEnd.value);
}
function genHead() {
return createBaseVNode("div", {
"class": "v-calendar-weekly__head",
"role": "row"
}, [genHeadDays()]);
}
function genHeadDays() {
const header = todayWeek.value.map(genHeadDay);
if (props.showWeek) {
header.unshift(createBaseVNode("div", {
"class": "v-calendar-weekly__head-weeknumber"
}, null));
}
return header;
}
function genHeadDay(day, index) {
const outside = isOutside(days.value[index]);
const color = day.present ? props.color : void 0;
return createBaseVNode("div", mergeProps(base.getColorProps({
text: color
}), {
"key": day.date,
"class": ["v-calendar-weekly__head-weekday", base.getRelativeClasses(day, outside)],
"role": "columnheader"
}), [base.weekdayFormatter.value(day, props.shortWeekdays)]);
}
function genWeeks() {
const daysValue = days.value;
const weekDays = base.parsedWeekdays.value.length;
const weeks = [];
for (let i = 0; i < daysValue.length; i += weekDays) {
weeks.push(genWeek(daysValue.slice(i, i + weekDays), getWeekNumber(daysValue[i])));
}
return weeks;
}
function genWeek(week, weekNumber) {
const weekNodes = week.map((day, index) => genDay(day, index, week));
if (props.showWeek) {
weekNodes.unshift(genWeekNumber(weekNumber));
}
return createBaseVNode("div", {
"key": week[0].date,
"class": "v-calendar-weekly__week",
"role": "row"
}, [weekNodes]);
}
function getWeekNumber(determineDay) {
return base.getWeekNumber(determineDay);
}
function genWeekNumber(weekNumber) {
return createBaseVNode("div", {
"class": "v-calendar-weekly__weeknumber"
}, [createBaseVNode("small", null, [String(weekNumber)])]);
}
function genDay(day, index, week) {
const outside = isOutside(day);
const events = getPrefixedEventHandlers(attrs, ":day", (nativeEvent) => {
return {
nativeEvent,
...day
};
});
return createBaseVNode("div", mergeProps({
"key": day.date,
"class": ["v-calendar-weekly__day", base.getRelativeClasses(day, outside)],
"role": "cell"
}, events), [genDayLabel(day), slots.day?.({
outside,
index,
week,
...day
})]);
}
function genDayLabel(day) {
return createBaseVNode("div", {
"class": "v-calendar-weekly__day-label"
}, [slots["day-label"]?.(day) ?? genDayLabelButton(day)]);
}
function genDayLabelButton(day) {
const hasMonth = day.day === 1 && props.showMonthOnFirst;
const events = getPrefixedEventHandlers(attrs, ":date", (nativeEvent) => ({
nativeEvent,
...day
}));
return createVNode(VIconBtn, mergeProps({
"active": day.present,
"activeColor": props.color,
"variant": "outlined",
"baseVariant": "text",
"onUpdate:active": noop
}, events), {
default: () => [hasMonth ? monthFormatter.value(day, props.shortMonths) + " " + base.dayFormatter.value(day, false) : base.dayFormatter.value(day, false)]
});
}
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-calendar-weekly", theme.themeClasses.value]),
"onDragstart": (e) => e.preventDefault()
}, [!props.hideHeader ? genHead() : void 0, genWeeks()]));
return {
...base,
days,
todayWeek,
monthFormatter,
isOutside
};
}
});
// node_modules/vuetify/lib/components/VCalendar/composables/calendarWithEvents.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCalendar/composables/calendarWithEvents.css";
// node_modules/vuetify/lib/components/VCalendar/modes/common.js
var MILLIS_IN_DAY = 864e5;
function getVisuals(events) {
let minStart = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
const visuals = events.map((event) => ({
event,
columnCount: 0,
column: 0,
left: 0,
width: 100
}));
visuals.sort((a, b) => {
return Math.max(minStart, a.event.startTimestampIdentifier) - Math.max(minStart, b.event.startTimestampIdentifier) || b.event.endTimestampIdentifier - a.event.endTimestampIdentifier;
});
return visuals;
}
function hasOverlap(s0, e0, s1, e1) {
let exclude = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : true;
return exclude ? !(s0 >= e1 || e0 <= s1) : !(s0 > e1 || e0 < s1);
}
function setColumnCount(groups) {
groups.forEach((group) => {
group.visuals.forEach((groupVisual) => {
groupVisual.columnCount = groups.length;
});
});
}
function getRange(event) {
return [event.startTimestampIdentifier, event.endTimestampIdentifier];
}
function getDayRange(event) {
return [event.startIdentifier, event.endIdentifier];
}
function getNormalizedRange(event, dayStart) {
return [Math.max(dayStart, event.startTimestampIdentifier), Math.min(dayStart + MILLIS_IN_DAY, event.endTimestampIdentifier)];
}
function getOpenGroup(groups, start, end, timed) {
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
let intersected = false;
if (hasOverlap(start, end, group.start, group.end, timed)) {
for (let k = 0; k < group.visuals.length; k++) {
const groupVisual = group.visuals[k];
const [groupStart, groupEnd] = timed ? getRange(groupVisual.event) : getDayRange(groupVisual.event);
if (hasOverlap(start, end, groupStart, groupEnd, timed)) {
intersected = true;
break;
}
}
}
if (!intersected) {
return i;
}
}
return -1;
}
function getOverlapGroupHandler(firstWeekday) {
const handler = {
groups: [],
min: -1,
max: -1,
reset: () => {
handler.groups = [];
handler.min = handler.max = -1;
},
getVisuals: function(day, dayEvents, timed) {
let reset = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
if (day.weekday === firstWeekday || reset) {
handler.reset();
}
const dayStart = getTimestampIdentifier(day);
const visuals = getVisuals(dayEvents, dayStart);
visuals.forEach((visual) => {
const [start, end] = timed ? getRange(visual.event) : getDayRange(visual.event);
if (handler.groups.length > 0 && !hasOverlap(start, end, handler.min, handler.max, timed)) {
setColumnCount(handler.groups);
handler.reset();
}
let targetGroup = getOpenGroup(handler.groups, start, end, timed);
if (targetGroup === -1) {
targetGroup = handler.groups.length;
handler.groups.push({
start,
end,
visuals: []
});
}
const target = handler.groups[targetGroup];
target.visuals.push(visual);
target.start = Math.min(target.start, start);
target.end = Math.max(target.end, end);
visual.column = targetGroup;
if (handler.min === -1) {
handler.min = start;
handler.max = end;
} else {
handler.min = Math.min(handler.min, start);
handler.max = Math.max(handler.max, end);
}
});
setColumnCount(handler.groups);
if (timed) {
handler.reset();
}
return visuals;
}
};
return handler;
}
// node_modules/vuetify/lib/components/VCalendar/modes/column.js
var FULL_WIDTH = 100;
var column = (events, firstWeekday, overlapThreshold) => {
const handler = getOverlapGroupHandler(firstWeekday);
return (day, dayEvents, timed, reset) => {
const visuals = handler.getVisuals(day, dayEvents, timed, reset);
if (timed) {
visuals.forEach((visual) => {
visual.left = visual.column * FULL_WIDTH / visual.columnCount;
visual.width = FULL_WIDTH / visual.columnCount;
});
}
return visuals;
};
};
// node_modules/vuetify/lib/components/VCalendar/modes/stack.js
var FULL_WIDTH2 = 100;
var DEFAULT_OFFSET = 5;
var WIDTH_MULTIPLIER = 1.7;
var stack = (events, firstWeekday, overlapThreshold) => {
const handler = getOverlapGroupHandler(firstWeekday);
return (day, dayEvents, timed, reset) => {
if (!timed) {
return handler.getVisuals(day, dayEvents, timed, reset);
}
const dayStart = getTimestampIdentifier(day);
const visuals = getVisuals(dayEvents, dayStart);
const groups = getGroups(visuals, dayStart);
for (const group of groups) {
const nodes = [];
for (const visual of group.visuals) {
const child = getNode(visual, dayStart);
const index = getNextIndex(child, nodes);
if (index === false) {
const parent = getParent(child, nodes);
if (parent) {
child.parent = parent;
child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold));
child.index = parent.index + 1;
parent.children.push(child);
}
} else {
const [parent] = getOverlappingRange(child, nodes, index - 1, index - 1);
const children = getOverlappingRange(child, nodes, index + 1, index + nodes.length, true);
child.children = children;
child.index = index;
if (parent) {
child.parent = parent;
child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold));
parent.children.push(child);
}
for (const grand of children) {
if (grand.parent === parent) {
grand.parent = child;
}
const grandNext = grand.index - child.index <= 1;
if (grandNext && child.sibling && hasOverlap(child.start, addTime(child.start, overlapThreshold), grand.start, grand.end)) {
grand.sibling = true;
}
}
}
nodes.push(child);
}
calculateBounds(nodes, overlapThreshold);
}
visuals.sort((a, b) => a.left - b.left || a.event.startTimestampIdentifier - b.event.startTimestampIdentifier);
return visuals;
};
};
function calculateBounds(nodes, overlapThreshold) {
for (const node of nodes) {
const {
visual,
parent
} = node;
const columns = getMaxChildIndex(node) + 1;
const spaceLeft = parent ? parent.visual.left : 0;
const spaceWidth = FULL_WIDTH2 - spaceLeft;
const offset = Math.min(DEFAULT_OFFSET, FULL_WIDTH2 / columns);
const columnWidthMultiplier = getColumnWidthMultiplier(node, nodes);
const columnOffset = spaceWidth / (columns - node.index + 1);
const columnWidth = spaceWidth / (columns - node.index + (node.sibling ? 1 : 0)) * columnWidthMultiplier;
if (parent) {
visual.left = node.sibling ? spaceLeft + columnOffset : spaceLeft + offset;
}
visual.width = hasFullWidth(node, nodes, overlapThreshold) ? FULL_WIDTH2 - visual.left : Math.min(FULL_WIDTH2 - visual.left, columnWidth * WIDTH_MULTIPLIER);
}
}
function getColumnWidthMultiplier(node, nodes) {
if (!node.children.length) {
return 1;
}
const maxColumn = node.index + nodes.length;
const minColumn = node.children.reduce((min, c) => Math.min(min, c.index), maxColumn);
return minColumn - node.index;
}
function getOverlappingIndices(node, nodes) {
const indices = [];
for (const other of nodes) {
if (hasOverlap(node.start, node.end, other.start, other.end)) {
indices.push(other.index);
}
}
return indices;
}
function getNextIndex(node, nodes) {
const indices = getOverlappingIndices(node, nodes);
indices.sort();
for (let i = 0; i < indices.length; i++) {
if (i < indices[i]) {
return i;
}
}
return false;
}
function getOverlappingRange(node, nodes, indexMin, indexMax) {
let returnFirstColumn = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : false;
const overlapping = [];
for (const other of nodes) {
if (other.index >= indexMin && other.index <= indexMax && hasOverlap(node.start, node.end, other.start, other.end)) {
overlapping.push(other);
}
}
if (returnFirstColumn && overlapping.length > 0) {
const first = overlapping.reduce((min, n) => Math.min(min, n.index), overlapping[0].index);
return overlapping.filter((n) => n.index === first);
}
return overlapping;
}
function getParent(node, nodes) {
let parent = null;
for (const other of nodes) {
if (hasOverlap(node.start, node.end, other.start, other.end) && (parent === null || other.index > parent.index)) {
parent = other;
}
}
return parent;
}
function hasFullWidth(node, nodes, overlapThreshold) {
for (const other of nodes) {
if (other !== node && other.index > node.index && hasOverlap(node.start, addTime(node.start, overlapThreshold), other.start, other.end)) {
return false;
}
}
return true;
}
function getGroups(visuals, dayStart) {
const groups = [];
for (const visual of visuals) {
const [start, end] = getNormalizedRange(visual.event, dayStart);
let added = false;
for (const group of groups) {
if (hasOverlap(start, end, group.start, group.end)) {
group.visuals.push(visual);
group.end = Math.max(group.end, end);
added = true;
break;
}
}
if (!added) {
groups.push({
start,
end,
visuals: [visual]
});
}
}
return groups;
}
function getNode(visual, dayStart) {
const [start, end] = getNormalizedRange(visual.event, dayStart);
return {
parent: null,
sibling: true,
index: 0,
visual,
start,
end,
children: []
};
}
function getMaxChildIndex(node) {
let max = node.index;
for (const child of node.children) {
const childMax = getMaxChildIndex(child);
if (childMax > max) {
max = childMax;
}
}
return max;
}
function addTime(identifier, minutes) {
const removeMinutes = identifier % 100;
const totalMinutes = removeMinutes + minutes;
const addHours = Math.floor(totalMinutes / 60);
const addMinutes = totalMinutes % 60;
return identifier - removeMinutes + addHours * 100 + addMinutes;
}
// node_modules/vuetify/lib/components/VCalendar/modes/index.js
var CalendarEventOverlapModes = {
stack,
column
};
// node_modules/vuetify/lib/components/VCalendar/util/events.js
function parseEvent(input, index, startProperty, endProperty) {
let timed = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : false;
let category = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : false;
const startInput = input[startProperty];
const endInput = input[endProperty];
const startParsed = parseTimestamp(startInput, true);
const endParsed = endInput ? parseTimestamp(endInput, true) : startParsed;
const start = isTimedless(startInput) ? updateHasTime(startParsed, timed) : startParsed;
const end = isTimedless(endInput) ? updateHasTime(endParsed, timed) : endParsed;
const startIdentifier = getDayIdentifier(start);
const startTimestampIdentifier = getTimestampIdentifier(start);
const endIdentifier = getDayIdentifier(end);
const endOffset = start.hasTime ? 0 : 2359;
const endTimestampIdentifier = getTimestampIdentifier(end) + endOffset;
const allDay = !start.hasTime;
return {
input,
start,
startIdentifier,
startTimestampIdentifier,
end,
endIdentifier,
endTimestampIdentifier,
allDay,
index,
category
};
}
function isEventOn(event, dayIdentifier) {
return dayIdentifier >= event.startIdentifier && dayIdentifier <= event.endIdentifier;
}
function isEventOnDay(event, day, inRange) {
if (inRange) {
const dayStart = nextMinutes(copyTimestamp(day), inRange[0]);
const dayEnd = nextMinutes(copyTimestamp(day), inRange[1]);
const starts = event.startTimestampIdentifier < getTimestampIdentifier(dayEnd);
const ends = event.endTimestampIdentifier > getTimestampIdentifier(dayStart);
return starts && ends;
}
return isEventOn(event, getDayIdentifier(day));
}
function isEventHiddenOn(event, day) {
return event.end.time === "00:00" && event.end.date === day.date && event.start.date !== day.date;
}
function isEventStart(event, day, dayIdentifier, firstWeekday) {
return dayIdentifier === event.startIdentifier || firstWeekday === day.weekday && isEventOn(event, dayIdentifier);
}
function isEventOverlapping(event, startIdentifier, endIdentifier) {
return startIdentifier <= event.endIdentifier && endIdentifier >= event.startIdentifier;
}
// node_modules/vuetify/lib/components/VCalendar/composables/calendarWithEvents.js
var WIDTH_FULL = 100;
var WIDTH_START = 95;
var makeCalendarWithEventsProps = propsFactory({
events: {
type: Array,
default: () => []
},
eventStart: {
type: String,
default: "start"
},
eventEnd: {
type: String,
default: "end"
},
eventTimed: {
type: [String, Function],
default: "timed"
},
eventCategory: {
type: [String, Function],
default: "category"
},
eventHeight: {
type: Number,
default: 20
},
eventColor: {
type: [String, Function],
default: "primary"
},
eventTextColor: {
type: [String, Function]
},
eventName: {
type: [String, Function],
default: "name"
},
eventOverlapThreshold: {
type: [String, Number],
default: 60
},
eventOverlapMode: {
type: [String, Function],
default: "stack",
validate: (mode) => mode in CalendarEventOverlapModes || typeof mode === "function"
},
eventMore: {
type: Boolean,
default: true
},
eventMoreText: {
type: String,
default: "$vuetify.calendar.moreEvents"
},
eventRipple: {
type: [Boolean, Object],
default: null
},
eventMarginBottom: {
type: Number,
default: 1
}
}, "VCalendar-events");
function useCalendarWithEvents(props, slots, attrs) {
const base = useCalendarBase(props);
const noEvents = computed(() => {
return !Array.isArray(props.events) || props.events.length === 0;
});
const categoryMode = computed(() => {
return props.type === "category";
});
const eventTimedFunction = computed(() => {
return typeof props.eventTimed === "function" ? props.eventTimed : (event) => !!event[props.eventTimed];
});
const eventCategoryFunction = computed(() => {
return typeof props.eventCategory === "function" ? props.eventCategory : (event) => event[props.eventCategory];
});
const parsedEvents = computed(() => {
if (!props.events) return [];
return props.events.map((event, index) => parseEvent(event, index, props.eventStart || "", props.eventEnd || "", eventTimedFunction.value(event), categoryMode.value ? eventCategoryFunction.value(event) : false));
});
const parsedEventOverlapThreshold = computed(() => {
return parseInt(String(props.eventOverlapThreshold || 0));
});
const eventTextColorFunction = computed(() => {
return typeof props.eventTextColor === "function" ? props.eventTextColor : () => props.eventTextColor;
});
const eventNameFunction = computed(() => {
return typeof props.eventName === "function" ? props.eventName : (event, timedEvent) => event.input[props.eventName] || "";
});
const eventModeFunction = computed(() => {
return typeof props.eventOverlapMode === "function" ? props.eventOverlapMode : CalendarEventOverlapModes[props.eventOverlapMode];
});
const eventWeekdays = computed(() => {
return base.effectiveWeekdays.value;
});
function eventColorFunction(e) {
return typeof props.eventColor === "function" ? props.eventColor(e) : e.color || props.eventColor;
}
const eventsRef = ref([]);
function updateEventVisibility() {
if (noEvents.value || !props.eventMore) {
return;
}
const eventHeight = props.eventHeight || 0;
const eventsMap = getEventsMap();
for (const date in eventsMap) {
const {
parent,
events,
more
} = eventsMap[date];
if (!more) {
break;
}
const parentBounds = parent.getBoundingClientRect();
const last = events.length - 1;
const eventsSorted = events.map((event) => ({
event,
bottom: event.getBoundingClientRect().bottom
})).sort((a, b) => a.bottom - b.bottom);
let hidden = 0;
for (let i = 0; i <= last; i++) {
const bottom = eventsSorted[i].bottom;
const hide = i === last ? bottom > parentBounds.bottom : bottom + eventHeight > parentBounds.bottom;
if (hide) {
eventsSorted[i].event.style.display = "none";
hidden++;
}
}
if (hidden) {
more.style.display = "";
more.innerHTML = base.locale.t(props.eventMoreText, hidden);
} else {
more.style.display = "none";
}
}
}
function getEventsMap() {
const eventsMap = {};
const elements = eventsRef.value;
if (!elements || !elements.length) {
return eventsMap;
}
elements.forEach((el) => {
const date = el.getAttribute("data-date");
if (el.parentElement && date) {
if (!(date in eventsMap)) {
eventsMap[date] = {
parent: el.parentElement,
more: null,
events: []
};
}
if (el.getAttribute("data-more")) {
eventsMap[date].more = el;
} else {
eventsMap[date].events.push(el);
el.style.display = "";
}
}
});
return eventsMap;
}
function genDayEvent(_ref, day) {
let {
event
} = _ref;
const eventHeight = props.eventHeight || 0;
const eventMarginBottom = props.eventMarginBottom || 0;
const dayIdentifier = getDayIdentifier(day);
const week = day.week;
const start = dayIdentifier === event.startIdentifier;
let end = dayIdentifier === event.endIdentifier;
let width = WIDTH_START;
if (!categoryMode.value) {
for (let i = day.index + 1; i < week.length; i++) {
const weekdayIdentifier = getDayIdentifier(week[i]);
if (event.endIdentifier >= weekdayIdentifier) {
width += WIDTH_FULL;
end = end || weekdayIdentifier === event.endIdentifier;
} else {
end = true;
break;
}
}
}
const scope = {
eventParsed: event,
day,
start,
end,
timed: false
};
return genEvent(event, scope, false, {
class: ["v-event", {
"v-event-start": start,
"v-event-end": end
}],
style: {
height: `${eventHeight}px`,
width: `${width}%`,
marginBottom: `${eventMarginBottom}px`
},
"data-date": day.date
});
}
function genTimedEvent(_ref2, day) {
let {
event,
left,
width
} = _ref2;
const startDelta = day.timeDelta(event.start, day);
const endDelta = day.timeDelta(event.end, day);
if (endDelta === false || startDelta === false || endDelta < 0 || startDelta >= 1 || isEventHiddenOn(event, day)) {
return false;
}
const dayIdentifier = getDayIdentifier(day);
const start = event.startIdentifier >= dayIdentifier;
const end = event.endIdentifier > dayIdentifier;
const top = day.timeToY(event.start, day);
const bottom = day.timeToY(event.end, day);
const height = Math.max(props.eventHeight || 0, bottom - top);
const scope = {
eventParsed: event,
day,
start,
end,
timed: true
};
return genEvent(event, scope, true, {
class: "v-event-timed",
style: {
top: `${top}px`,
height: `${height}px`,
left: `${left}%`,
width: `${width}%`
}
});
}
function genEvent(event, scopeInput, timedEvent, data) {
const slot = slots.event;
const text = eventTextColorFunction.value(event.input);
const background = eventColorFunction(event.input);
const overlapsNoon = event.start.hour < 12 && event.end.hour >= 12;
const singline = diffMinutes(event.start, event.end) <= parsedEventOverlapThreshold.value;
const formatTime = (withTime, ampm) => {
const formatter = base.getFormatter({
timeZone: "UTC",
hour: "numeric",
minute: withTime.minute > 0 ? "numeric" : void 0
});
return formatter(withTime, true);
};
const timeSummary = () => formatTime(event.start, overlapsNoon) + " - " + formatTime(event.end, true);
const eventSummary = () => {
const name = eventNameFunction.value(event, timedEvent);
if (event.start.hasTime) {
if (timedEvent) {
const time = timeSummary();
const delimiter = singline ? ", " : createBaseVNode("br", null, null);
return createBaseVNode("span", {
"class": "v-event-summary"
}, [createBaseVNode("strong", null, [name]), delimiter, time]);
} else {
const time = formatTime(event.start, true);
return createBaseVNode("span", {
"class": "v-event-summary"
}, [createBaseVNode("strong", null, [time]), createTextVNode(" "), name]);
}
}
return createBaseVNode("span", {
"class": "v-event-summary"
}, [name]);
};
const scope = {
...scopeInput,
event: event.input,
outside: scopeInput.day.outside,
singline,
overlapsNoon,
formatTime,
timeSummary,
eventSummary
};
const events = getPrefixedEventHandlers(attrs, ":event", (nativeEvent) => ({
...scope,
nativeEvent
}));
return withDirectives(createBaseVNode("div", mergeProps(base.getColorProps({
text,
background
}), events, data, {
"ref_for": true,
"ref": eventsRef
}), [slot?.(scope) ?? genName(eventSummary)]), [[ripple_default, props.eventRipple ?? true]]);
}
function genName(eventSummary) {
return createBaseVNode("div", {
"class": "pl-1"
}, [eventSummary()]);
}
function genPlaceholder(day) {
const height = (props.eventHeight || 0) + (props.eventMarginBottom || 0);
return createBaseVNode("div", {
"style": {
height: `${height}px`
},
"data-date": day.date,
"ref_for": true,
"ref": eventsRef
}, null);
}
function genMore(day) {
const eventHeight = props.eventHeight || 0;
const eventMarginBottom = props.eventMarginBottom || 0;
const events = getPrefixedEventHandlers(attrs, ":more", (nativeEvent) => ({
nativeEvent,
...day
}));
return withDirectives(createBaseVNode("div", mergeProps({
"class": ["v-event-more pl-1", {
"v-outside": day.outside
}],
"data-date": day.date,
"data-more": "1",
"style": {
display: "none",
height: `${eventHeight}px`,
marginBottom: `${eventMarginBottom}px`
},
"ref_for": true,
"ref": eventsRef
}, events), null), [[ripple_default, props.eventRipple ?? true]]);
}
function getVisibleEvents() {
const days = base.days.value;
const start = getDayIdentifier(days[0]);
const end = getDayIdentifier(days[days.length - 1]);
return parsedEvents.value.filter((event) => isEventOverlapping(event, start, end));
}
function isEventForCategory(event, category) {
return !categoryMode.value || typeof category === "object" && category.categoryName && category.categoryName === event.category || typeof event.category === "string" && category === event.category || typeof event.category !== "string" && category === null;
}
function getEventsForDay(day) {
const identifier = getDayIdentifier(day);
const firstWeekday = eventWeekdays.value[0];
return parsedEvents.value.filter((event) => isEventStart(event, day, identifier, firstWeekday));
}
function getEventsForDayAll(day) {
const identifier = getDayIdentifier(day);
const firstWeekday = eventWeekdays.value[0];
return parsedEvents.value.filter((event) => event.allDay && (categoryMode.value ? isEventOn(event, identifier) : isEventStart(event, day, identifier, firstWeekday)) && isEventForCategory(event, day.category));
}
function getEventsForDayTimed(day) {
return parsedEvents.value.filter((event) => !event.allDay && isEventOnDay(event, day, day.intervalRange) && isEventForCategory(event, day.category));
}
function getScopedSlots() {
if (noEvents.value) {
return {
...slots
};
}
const mode = eventModeFunction.value(parsedEvents.value, eventWeekdays.value[0], parsedEventOverlapThreshold.value);
const isNode = (input) => !!input;
const getSlotChildren = (day, getter, mapper, timed) => {
const events = getter(day);
const visuals = mode(day, events, timed, categoryMode.value);
if (timed) {
return visuals.map((visual) => mapper(visual, day)).filter(isNode);
}
const children = [];
visuals.forEach((visual, index) => {
while (children.length < visual.column) {
children.push(genPlaceholder(day));
}
const mapped = mapper(visual, day);
if (mapped) {
children.push(mapped);
}
});
return children;
};
return {
...slots,
day: (day) => {
let children = getSlotChildren(day, getEventsForDay, genDayEvent, false);
if (children && children.length > 0 && props.eventMore) {
children.push(genMore(day));
}
if (slots.day) {
const slot = slots.day(day);
if (slot) {
children = children ? children.concat(slot) : slot;
}
}
return children;
},
"day-header": (day) => {
let children = getSlotChildren(day, getEventsForDayAll, genDayEvent, false);
if (slots["day-header"]) {
const slot = slots["day-header"](day);
if (slot) {
children = children ? children.concat(slot) : slot;
}
}
return children;
},
"day-body": (day) => {
const events = getSlotChildren(day, getEventsForDayTimed, genTimedEvent, true);
let children = [createBaseVNode("div", {
"class": "v-event-timed-container"
}, [events])];
if (slots["day-body"]) {
const slot = slots["day-body"](day);
if (slot) {
children = children.concat(slot);
}
}
return children;
}
};
}
return {
...base,
noEvents,
parsedEvents,
parsedEventOverlapThreshold,
eventTimedFunction,
eventCategoryFunction,
eventTextColorFunction,
eventNameFunction,
eventModeFunction,
eventWeekdays,
categoryMode,
eventColorFunction,
eventsRef,
updateEventVisibility,
getEventsMap,
genDayEvent,
genTimedEvent,
genEvent,
genName,
genPlaceholder,
genMore,
getVisibleEvents,
isEventForCategory,
getEventsForDay,
getEventsForDayAll,
getEventsForDayTimed,
getScopedSlots
};
}
// node_modules/vuetify/lib/components/VCalendar/VCalendar.js
var VCalendar = genericComponent()({
name: "VCalendar",
directives: {
vResize: resize_default
},
props: {
modelValue: {
type: [String, Number, Date],
validate: validateTimestamp
},
categoryDays: {
type: [Number, String],
default: 1,
validate: (x) => isFinite(parseInt(x)) && parseInt(x) > 0
},
categories: {
type: [Array, String],
default: ""
},
categoryText: {
type: [String, Function]
},
maxDays: {
type: Number,
default: 7
},
categoryHideDynamic: {
type: Boolean
},
categoryShowAll: {
type: Boolean
},
categoryForInvalid: {
type: String,
default: ""
},
...makeCalendarBaseProps(),
...makeCalendarWithEventsProps()
},
setup(props, _ref) {
let {
slots,
attrs,
emit
} = _ref;
const root = ref();
const base = useCalendarWithEvents(props, slots, attrs);
const lastStart = ref(null);
const lastEnd = ref(null);
const parsedCategoryDays = computed(() => {
return parseInt(String(props.categoryDays)) || 1;
});
const parsedCategories = computed(() => {
return getParsedCategories(props.categories, props.categoryText);
});
const renderProps = computed(() => {
const around = base.parsedValue.value;
let component = null;
let maxDays = props.maxDays;
let categories = parsedCategories.value;
let start = around;
let end = around;
switch (props.type) {
case "month":
component = VCalendarWeekly;
start = getStartOfMonth(around);
end = getEndOfMonth(around);
break;
case "week":
component = VCalendarDaily;
start = base.getStartOfWeek(around);
end = base.getEndOfWeek(around);
maxDays = 7;
break;
case "day":
component = VCalendarDaily;
maxDays = 1;
break;
case "4day":
component = VCalendarDaily;
end = relativeDays(copyTimestamp(end), nextDay, 3);
updateFormatted(end);
maxDays = 4;
break;
case "custom-weekly":
component = VCalendarWeekly;
start = base.parsedStart.value || around;
end = base.parsedEnd.value;
break;
case "custom-daily":
component = VCalendarDaily;
start = base.parsedStart.value || around;
end = base.parsedEnd.value;
break;
case "category":
const days = parsedCategoryDays.value;
component = VCalendarCategory;
end = relativeDays(copyTimestamp(end), nextDay, days);
updateFormatted(end);
maxDays = days;
categories = getCategoryList(categories);
break;
default:
const type = props.type;
throw new Error(`${type} is not a valid Calendar type`);
}
return {
component,
start,
end,
maxDays,
categories
};
});
const eventWeekdays = computed(() => {
return base.effectiveWeekdays.value;
});
const categoryMode = computed(() => {
return props.type === "category";
});
const monthLongFormatter = computed(() => {
return base.getFormatter({
timeZone: "UTC",
month: "long"
});
});
const monthShortFormatter = computed(() => {
return base.getFormatter({
timeZone: "UTC",
month: "short"
});
});
const title = computed(() => {
const {
start,
end
} = renderProps.value;
const spanYears = start.year !== end.year;
const spanMonths = spanYears || start.month !== end.month;
if (spanYears) {
return monthShortFormatter.value(start, true) + " " + start.year + " - " + monthShortFormatter.value(end, true) + " " + end.year;
}
if (spanMonths) {
return monthShortFormatter.value(start, true) + " - " + monthShortFormatter.value(end, true) + " " + end.year;
} else {
return monthLongFormatter.value(start, false) + " " + start.year;
}
});
function checkChange() {
const {
start,
end
} = renderProps.value;
if (!lastStart.value || !lastEnd.value || start.date !== lastStart.value.date || end.date !== lastEnd.value.date) {
lastStart.value = start;
lastEnd.value = end;
emit("change", {
start,
end
});
}
}
function move() {
let amount = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1;
const moved = copyTimestamp(base.parsedValue.value);
const forward = amount > 0;
const mover = forward ? nextDay : prevDay;
const limit = forward ? DAYS_IN_MONTH_MAX : DAY_MIN;
let times = forward ? amount : -amount;
while (--times >= 0) {
switch (props.type) {
case "month":
moved.day = limit;
mover(moved);
break;
case "week":
relativeDays(moved, mover, DAYS_IN_WEEK);
break;
case "day":
relativeDays(moved, mover, 1);
break;
case "4day":
relativeDays(moved, mover, 4);
break;
case "category":
relativeDays(moved, mover, parsedCategoryDays.value);
break;
}
}
updateWeekday(moved);
updateFormatted(moved);
updateRelative(moved, base.times.now);
if (props.modelValue instanceof Date) {
emit("update:modelValue", timestampToDate(moved));
} else if (typeof props.modelValue === "number") {
emit("update:modelValue", timestampToDate(moved).getTime());
} else {
emit("update:modelValue", moved.date);
}
emit("moved", moved);
}
function next() {
let amount = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1;
move(amount);
}
function prev() {
let amount = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1;
move(-amount);
}
function getCategoryList(categories) {
if (!base.noEvents.value) {
const categoryMap = categories.reduce((map, category, index) => {
if (typeof category === "object" && category.categoryName) map[category.categoryName] = {
index,
count: 0
};
else if (typeof category === "string") map[category] = {
index,
count: 0
};
return map;
}, {});
if (!props.categoryHideDynamic || !props.categoryShowAll) {
let categoryLength = categories.length;
base.parsedEvents.value.forEach((ev) => {
let category = ev.category;
if (typeof category !== "string") {
category = props.categoryForInvalid;
}
if (!category) {
return;
}
if (category in categoryMap) {
categoryMap[category].count++;
} else if (!props.categoryHideDynamic) {
categoryMap[category] = {
index: categoryLength++,
count: 1
};
}
});
}
if (!props.categoryShowAll) {
for (const category in categoryMap) {
if (categoryMap[category].count === 0) {
delete categoryMap[category];
}
}
}
categories = categories.filter((category) => {
if (typeof category === "object" && category.categoryName) {
return categoryMap.hasOwnProperty(category.categoryName);
} else if (typeof category === "string") {
return categoryMap.hasOwnProperty(category);
}
return false;
});
}
return categories;
}
watch(renderProps, checkChange);
onMounted(() => {
base.updateEventVisibility();
checkChange();
});
onUpdated(() => {
window.requestAnimationFrame(base.updateEventVisibility);
});
useRender(() => {
const {
start,
end,
maxDays,
component: Component,
categories
} = renderProps.value;
return withDirectives(createVNode(Component, mergeProps({
"ref": root,
"class": ["v-calendar", {
"v-calendar-events": !base.noEvents.value
}],
"role": "grid"
}, Component.filterProps(props), {
"start": start.date,
"end": end.date,
"maxDays": maxDays,
"weekdays": base.effectiveWeekdays.value,
"categories": categories,
"onClick:date": (e, day) => {
if (attrs["onUpdate:modelValue"]) emit("update:modelValue", day.date);
}
}), base.getScopedSlots()), [[resize_default, base.updateEventVisibility, void 0, {
quiet: true
}]]);
});
return forwardRefs({
...base,
lastStart,
lastEnd,
parsedCategoryDays,
renderProps,
eventWeekdays,
categoryMode,
title,
monthLongFormatter,
monthShortFormatter,
parsedCategories,
checkChange,
move,
next,
prev,
getCategoryList
}, root);
}
});
// node_modules/vuetify/lib/components/VCarousel/VCarousel.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCarousel/VCarousel.css";
// node_modules/vuetify/lib/components/VWindow/VWindow.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VWindow/VWindow.css";
var VWindowSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-window");
var VWindowGroupSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-window-group");
var makeVWindowProps = propsFactory({
continuous: Boolean,
nextIcon: {
type: [Boolean, String, Function, Object],
default: "$next"
},
prevIcon: {
type: [Boolean, String, Function, Object],
default: "$prev"
},
reverse: Boolean,
showArrows: {
type: [Boolean, String],
validator: (v) => typeof v === "boolean" || v === "hover"
},
verticalArrows: [Boolean, String],
touch: {
type: [Object, Boolean],
default: void 0
},
direction: {
type: String,
default: "horizontal"
},
modelValue: null,
disabled: Boolean,
selectedClass: {
type: String,
default: "v-window-item--active"
},
// TODO: mandatory should probably not be exposed but do this for now
mandatory: {
type: [Boolean, String],
default: "force"
},
crossfade: Boolean,
transitionDuration: Number,
...makeComponentProps(),
...makeTagProps(),
...makeThemeProps()
}, "VWindow");
var VWindow = genericComponent()({
name: "VWindow",
directives: {
vTouch: touch_default
},
props: makeVWindowProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
isRtl
} = useRtl();
const {
t
} = useLocale();
const group = useGroup(props, VWindowGroupSymbol);
const rootRef = ref();
const isRtlReverse = computed(() => isRtl.value ? !props.reverse : props.reverse);
const isReversed = shallowRef(false);
const transition = computed(() => {
if (props.crossfade) {
return "v-window-crossfade-transition";
}
const axis = props.direction === "vertical" ? "y" : "x";
const reverse = isRtlReverse.value ? !isReversed.value : isReversed.value;
const direction = reverse ? "-reverse" : "";
return `v-window-${axis}${direction}-transition`;
});
const transitionCount = shallowRef(0);
const transitionHeight = ref(void 0);
const activeIndex = computed(() => {
return group.items.value.findIndex((item) => group.selected.value.includes(item.id));
});
watch(activeIndex, (newVal, oldVal) => {
let scrollableParent;
const savedScrollPosition = {
left: 0,
top: 0
};
if (IN_BROWSER && oldVal >= 0) {
scrollableParent = getScrollParent(rootRef.value);
savedScrollPosition.left = scrollableParent?.scrollLeft;
savedScrollPosition.top = scrollableParent?.scrollTop;
}
const itemsLength = group.items.value.length;
const lastIndex = itemsLength - 1;
if (itemsLength <= 2) {
isReversed.value = newVal < oldVal;
} else if (newVal === lastIndex && oldVal === 0) {
isReversed.value = false;
} else if (newVal === 0 && oldVal === lastIndex) {
isReversed.value = true;
} else {
isReversed.value = newVal < oldVal;
}
nextTick(() => {
if (!IN_BROWSER || !scrollableParent) return;
const currentScrollY = scrollableParent.scrollTop;
if (currentScrollY !== savedScrollPosition.top) {
scrollableParent.scrollTo({
...savedScrollPosition,
behavior: "instant"
});
}
requestAnimationFrame(() => {
if (!scrollableParent) return;
const rafScrollY = scrollableParent.scrollTop;
if (rafScrollY !== savedScrollPosition.top) {
scrollableParent.scrollTo({
...savedScrollPosition,
behavior: "instant"
});
}
});
});
}, {
flush: "sync"
});
provide(VWindowSymbol, {
transition,
isReversed,
transitionCount,
transitionHeight,
rootRef
});
const canMoveBack = toRef(() => props.continuous || activeIndex.value !== 0);
const canMoveForward = toRef(() => props.continuous || activeIndex.value !== group.items.value.length - 1);
function prev() {
canMoveBack.value && group.prev();
}
function next() {
canMoveForward.value && group.next();
}
const arrows = computed(() => {
const arrows2 = [];
const prevProps = {
icon: isRtl.value ? props.nextIcon : props.prevIcon,
class: `v-window__${isRtlReverse.value ? "right" : "left"}`,
onClick: group.prev,
"aria-label": t("$vuetify.carousel.prev")
};
arrows2.push(canMoveBack.value ? slots.prev ? slots.prev({
props: prevProps
}) : createVNode(VBtn, prevProps, null) : createBaseVNode("div", null, null));
const nextProps = {
icon: isRtl.value ? props.prevIcon : props.nextIcon,
class: `v-window__${isRtlReverse.value ? "left" : "right"}`,
onClick: group.next,
"aria-label": t("$vuetify.carousel.next")
};
arrows2.push(canMoveForward.value ? slots.next ? slots.next({
props: nextProps
}) : createVNode(VBtn, nextProps, null) : createBaseVNode("div", null, null));
return arrows2;
});
const touchOptions = computed(() => {
if (props.touch === false) return props.touch;
const options = {
left: () => {
isRtlReverse.value ? prev() : next();
},
right: () => {
isRtlReverse.value ? next() : prev();
},
start: (_ref2) => {
let {
originalEvent
} = _ref2;
originalEvent.stopPropagation();
}
};
return {
...options,
...props.touch === true ? {} : props.touch
};
});
useRender(() => withDirectives(createVNode(props.tag, {
"ref": rootRef,
"class": normalizeClass(["v-window", {
"v-window--show-arrows-on-hover": props.showArrows === "hover",
"v-window--vertical-arrows": !!props.verticalArrows,
"v-window--crossfade": !!props.crossfade
}, themeClasses.value, props.class]),
"style": normalizeStyle([props.style, {
"--v-window-transition-duration": !PREFERS_REDUCED_MOTION() ? convertToUnit(props.transitionDuration, "ms") : null
}])
}, {
default: () => [createBaseVNode("div", {
"class": "v-window__container",
"style": {
height: transitionHeight.value
}
}, [slots.default?.({
group
}), props.showArrows !== false && createBaseVNode("div", {
"class": normalizeClass(["v-window__controls", {
"v-window__controls--left": props.verticalArrows === "left" || props.verticalArrows === true
}, {
"v-window__controls--right": props.verticalArrows === "right"
}])
}, [arrows.value])]), slots.additional?.({
group
})]
}), [[touch_default, touchOptions.value]]));
return {
group
};
}
});
// node_modules/vuetify/lib/components/VCarousel/VCarousel.js
var makeVCarouselProps = propsFactory({
color: String,
cycle: Boolean,
delimiterIcon: {
type: IconValue,
default: "$delimiter"
},
height: {
type: [Number, String],
default: 500
},
hideDelimiters: Boolean,
hideDelimiterBackground: Boolean,
interval: {
type: [Number, String],
default: 6e3,
validator: (value) => Number(value) > 0
},
progress: [Boolean, String],
verticalDelimiters: [Boolean, String],
...makeVWindowProps({
continuous: true,
mandatory: "force",
showArrows: true
})
}, "VCarousel");
var VCarousel = genericComponent()({
name: "VCarousel",
props: makeVCarouselProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const model = useProxiedModel(props, "modelValue");
const {
t
} = useLocale();
const windowRef = ref();
let slideTimeout = -1;
watch(model, restartTimeout);
watch(() => props.interval, restartTimeout);
watch(() => props.cycle, (val) => {
if (val) restartTimeout();
else window.clearTimeout(slideTimeout);
});
onMounted(startTimeout);
function startTimeout() {
if (!props.cycle || !windowRef.value) return;
slideTimeout = window.setTimeout(windowRef.value.group.next, Number(props.interval) > 0 ? Number(props.interval) : 6e3);
}
function restartTimeout() {
window.clearTimeout(slideTimeout);
window.requestAnimationFrame(startTimeout);
}
useRender(() => {
const windowProps = VWindow.filterProps(props);
return createVNode(VWindow, mergeProps({
"ref": windowRef
}, windowProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"class": ["v-carousel", {
"v-carousel--hide-delimiter-background": props.hideDelimiterBackground,
"v-carousel--vertical-delimiters": props.verticalDelimiters
}, props.class],
"style": [{
height: convertToUnit(props.height)
}, props.style]
}), {
default: slots.default,
additional: (_ref2) => {
let {
group
} = _ref2;
return createBaseVNode(Fragment, null, [!props.hideDelimiters && createBaseVNode("div", {
"class": "v-carousel__controls",
"style": {
left: props.verticalDelimiters === "left" && props.verticalDelimiters ? 0 : "auto",
right: props.verticalDelimiters === "right" ? 0 : "auto"
}
}, [group.items.value.length > 0 && createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
color: props.color,
icon: props.delimiterIcon,
size: "x-small",
variant: "text"
}
},
"scoped": true
}, {
default: () => [group.items.value.map((item, index) => {
const props2 = {
id: `carousel-item-${item.id}`,
"aria-label": t("$vuetify.carousel.ariaLabel.delimiter", index + 1, group.items.value.length),
class: ["v-carousel__controls__item", group.isSelected(item.id) && "v-btn--active"],
onClick: () => group.select(item.id, true)
};
return slots.item ? slots.item({
props: props2,
item
}) : createVNode(VBtn, mergeProps(item, props2), null);
})]
})]), props.progress && createVNode(VProgressLinear, {
"absolute": true,
"class": "v-carousel__progress",
"color": typeof props.progress === "string" ? props.progress : void 0,
"modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100
}, null)]);
},
prev: slots.prev,
next: slots.next
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VWindow/VWindowItem.js
var makeVWindowItemProps = propsFactory({
reverseTransition: {
type: [Boolean, String],
default: void 0
},
transition: {
type: [Boolean, String],
default: void 0
},
...makeComponentProps(),
...makeGroupItemProps(),
...makeLazyProps()
}, "VWindowItem");
var VWindowItem = genericComponent()({
name: "VWindowItem",
directives: {
vTouch: touch_default
},
props: makeVWindowItemProps(),
emits: {
"group:selected": (val) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const window2 = inject(VWindowSymbol);
const groupItem = useGroupItem(props, VWindowGroupSymbol);
const {
isBooted
} = useSsrBoot();
if (!window2 || !groupItem) throw new Error("[Vuetify] VWindowItem must be used inside VWindow");
const isTransitioning = shallowRef(false);
const hasTransition = computed(() => isBooted.value && (window2.isReversed.value ? props.reverseTransition !== false : props.transition !== false));
function onAfterTransition() {
if (!isTransitioning.value || !window2) {
return;
}
isTransitioning.value = false;
if (window2.transitionCount.value > 0) {
window2.transitionCount.value -= 1;
if (window2.transitionCount.value === 0) {
window2.transitionHeight.value = void 0;
}
}
}
function onBeforeTransition() {
if (isTransitioning.value || !window2) {
return;
}
isTransitioning.value = true;
if (window2.transitionCount.value === 0) {
window2.transitionHeight.value = convertToUnit(window2.rootRef.value?.clientHeight);
}
window2.transitionCount.value += 1;
}
function onTransitionCancelled() {
onAfterTransition();
}
function onEnterTransition(el) {
if (!isTransitioning.value) {
return;
}
nextTick(() => {
if (!hasTransition.value || !isTransitioning.value || !window2) {
return;
}
window2.transitionHeight.value = convertToUnit(el.clientHeight);
});
}
const transition = computed(() => {
const name = window2.isReversed.value ? props.reverseTransition : props.transition;
return !hasTransition.value ? false : {
name: typeof name !== "string" ? window2.transition.value : name,
onBeforeEnter: onBeforeTransition,
onAfterEnter: onAfterTransition,
onEnterCancelled: onTransitionCancelled,
onBeforeLeave: onBeforeTransition,
onAfterLeave: onAfterTransition,
onLeaveCancelled: onTransitionCancelled,
onEnter: onEnterTransition
};
});
const {
hasContent
} = useLazy(props, groupItem.isSelected);
useRender(() => createVNode(MaybeTransition, {
"transition": transition.value,
"disabled": !isBooted.value
}, {
default: () => [withDirectives(createBaseVNode("div", {
"class": normalizeClass(["v-window-item", groupItem.selectedClass.value, props.class]),
"style": normalizeStyle(props.style)
}, [hasContent.value && slots.default?.()]), [[vShow, groupItem.isSelected.value]])]
}));
return {
groupItem
};
}
});
// node_modules/vuetify/lib/components/VCarousel/VCarouselItem.js
var makeVCarouselItemProps = propsFactory({
...makeVImgProps(),
...makeVWindowItemProps()
}, "VCarouselItem");
var VCarouselItem = genericComponent()({
name: "VCarouselItem",
inheritAttrs: false,
props: makeVCarouselItemProps(),
setup(props, _ref) {
let {
slots,
attrs
} = _ref;
useRender(() => {
const imgProps = VImg.filterProps(props);
const windowItemProps = VWindowItem.filterProps(props);
return createVNode(VWindowItem, mergeProps({
"class": ["v-carousel-item", props.class]
}, windowItemProps), {
default: () => [createVNode(VImg, mergeProps(attrs, imgProps), slots)]
});
});
}
});
// node_modules/vuetify/lib/components/VCode/index.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VCode/VCode.css";
var VCode = createSimpleFunctional("v-code", "code");
// node_modules/vuetify/lib/components/VColorPicker/VColorPicker.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VColorPicker/VColorPicker.css";
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerCanvas.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VColorPicker/VColorPickerCanvas.css";
var makeVColorPickerCanvasProps = propsFactory({
color: {
type: Object
},
disabled: Boolean,
dotSize: {
type: [Number, String],
default: 10
},
height: {
type: [Number, String],
default: 150
},
width: {
type: [Number, String],
default: 300
},
...makeComponentProps()
}, "VColorPickerCanvas");
var VColorPickerCanvas = defineComponent({
name: "VColorPickerCanvas",
props: makeVColorPickerCanvasProps(),
emits: {
"update:color": (color) => true,
"update:position": (hue) => true
},
setup(props, _ref) {
let {
emit
} = _ref;
const isInteracting = shallowRef(false);
const canvasRef = ref();
const canvasWidth = shallowRef(parseFloat(props.width));
const canvasHeight = shallowRef(parseFloat(props.height));
const _dotPosition = ref({
x: 0,
y: 0
});
const dotPosition = computed({
get: () => _dotPosition.value,
set(val) {
if (!canvasRef.value) return;
const {
x,
y
} = val;
_dotPosition.value = val;
emit("update:color", {
h: props.color?.h ?? 0,
s: clamp(x, 0, canvasWidth.value) / canvasWidth.value,
v: 1 - clamp(y, 0, canvasHeight.value) / canvasHeight.value,
a: props.color?.a ?? 1
});
}
});
const dotStyles = computed(() => {
const {
x,
y
} = dotPosition.value;
const radius = parseInt(props.dotSize, 10) / 2;
return {
width: convertToUnit(props.dotSize),
height: convertToUnit(props.dotSize),
transform: `translate(${convertToUnit(x - radius)}, ${convertToUnit(y - radius)})`
};
});
const {
resizeRef
} = useResizeObserver((entries) => {
if (!resizeRef.el?.offsetParent) return;
const {
width,
height
} = entries[0].contentRect;
canvasWidth.value = width;
canvasHeight.value = height;
});
function updateDotPosition(x, y, rect) {
const {
left,
top,
width,
height
} = rect;
dotPosition.value = {
x: clamp(x - left, 0, width),
y: clamp(y - top, 0, height)
};
}
function handleMouseDown(e) {
if (e.type === "mousedown") {
e.preventDefault();
}
if (props.disabled) return;
handleMouseMove(e);
window.addEventListener("mousemove", handleMouseMove);
window.addEventListener("mouseup", handleMouseUp);
window.addEventListener("touchmove", handleMouseMove);
window.addEventListener("touchend", handleMouseUp);
}
function handleMouseMove(e) {
if (props.disabled || !canvasRef.value) return;
isInteracting.value = true;
const coords = getEventCoordinates(e);
updateDotPosition(coords.clientX, coords.clientY, canvasRef.value.getBoundingClientRect());
}
function handleMouseUp() {
window.removeEventListener("mousemove", handleMouseMove);
window.removeEventListener("mouseup", handleMouseUp);
window.removeEventListener("touchmove", handleMouseMove);
window.removeEventListener("touchend", handleMouseUp);
}
function updateCanvas() {
if (!canvasRef.value) return;
const canvas = canvasRef.value;
const ctx = canvas.getContext("2d");
if (!ctx) return;
const saturationGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
saturationGradient.addColorStop(0, "hsla(0, 0%, 100%, 1)");
saturationGradient.addColorStop(1, `hsla(${props.color?.h ?? 0}, 100%, 50%, 1)`);
ctx.fillStyle = saturationGradient;
ctx.fillRect(0, 0, canvas.width, canvas.height);
const valueGradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
valueGradient.addColorStop(0, "hsla(0, 0%, 0%, 0)");
valueGradient.addColorStop(1, "hsla(0, 0%, 0%, 1)");
ctx.fillStyle = valueGradient;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
watch(() => props.color?.h, updateCanvas, {
immediate: true
});
watch(() => [canvasWidth.value, canvasHeight.value], (newVal, oldVal) => {
updateCanvas();
_dotPosition.value = {
x: dotPosition.value.x * newVal[0] / oldVal[0],
y: dotPosition.value.y * newVal[1] / oldVal[1]
};
}, {
flush: "post"
});
watch(() => props.color, () => {
if (isInteracting.value) {
isInteracting.value = false;
return;
}
_dotPosition.value = props.color ? {
x: props.color.s * canvasWidth.value,
y: (1 - props.color.v) * canvasHeight.value
} : {
x: 0,
y: 0
};
}, {
deep: true,
immediate: true
});
onMounted(() => updateCanvas());
useRender(() => createBaseVNode("div", {
"ref": resizeRef,
"class": normalizeClass(["v-color-picker-canvas", props.class]),
"style": normalizeStyle(props.style),
"onMousedown": handleMouseDown,
"onTouchstartPassive": handleMouseDown
}, [createBaseVNode("canvas", {
"ref": canvasRef,
"width": canvasWidth.value,
"height": canvasHeight.value
}, null), props.color && createBaseVNode("div", {
"class": normalizeClass(["v-color-picker-canvas__dot", {
"v-color-picker-canvas__dot--disabled": props.disabled
}]),
"style": normalizeStyle(dotStyles.value)
}, null)]));
return {};
}
});
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerEdit.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VColorPicker/VColorPickerEdit.css";
// node_modules/vuetify/lib/components/VColorPicker/util/index.js
function stripAlpha(color, stripAlpha2) {
if (stripAlpha2) {
const {
a,
...rest
} = color;
return rest;
}
return color;
}
function extractColor(color, input) {
if (input == null || typeof input === "string") {
const hasA = color.a !== 1;
if (input?.startsWith("rgb(")) {
const {
r,
g,
b,
a
} = HSVtoRGB(color);
return `rgb(${r} ${g} ${b}` + (hasA ? ` / ${a})` : ")");
} else if (input?.startsWith("hsl(")) {
const {
h,
s,
l,
a
} = HSVtoHSL(color);
return `hsl(${h} ${Math.round(s * 100)} ${Math.round(l * 100)}` + (hasA ? ` / ${a})` : ")");
}
const hex2 = HSVtoHex(color);
if (color.a === 1) return hex2.slice(0, 7);
else return hex2;
}
if (typeof input === "object") {
let converted;
if (has(input, ["r", "g", "b"])) converted = HSVtoRGB(color);
else if (has(input, ["h", "s", "l"])) converted = HSVtoHSL(color);
else if (has(input, ["h", "s", "v"])) converted = color;
return stripAlpha(converted, !has(input, ["a"]) && color.a === 1);
}
return color;
}
var nullColor = {
h: 0,
s: 0,
v: 0,
a: 1
};
var rgba = {
inputProps: {
type: "number",
min: 0
},
inputs: [{
label: "R",
max: 255,
step: 1,
getValue: (c) => Math.round(c.r),
getColor: (c, v) => ({
...c,
r: Number(v)
}),
localeKey: "redInput"
}, {
label: "G",
max: 255,
step: 1,
getValue: (c) => Math.round(c.g),
getColor: (c, v) => ({
...c,
g: Number(v)
}),
localeKey: "greenInput"
}, {
label: "B",
max: 255,
step: 1,
getValue: (c) => Math.round(c.b),
getColor: (c, v) => ({
...c,
b: Number(v)
}),
localeKey: "blueInput"
}, {
label: "A",
max: 1,
step: 0.01,
getValue: (_ref) => {
let {
a
} = _ref;
return a != null ? Math.round(a * 100) / 100 : 1;
},
getColor: (c, v) => ({
...c,
a: Number(v)
}),
localeKey: "alphaInput"
}],
to: HSVtoRGB,
from: RGBtoHSV
};
var rgb = {
...rgba,
inputs: rgba.inputs?.slice(0, 3)
};
var hsla = {
inputProps: {
type: "number",
min: 0
},
inputs: [{
label: "H",
max: 360,
step: 1,
getValue: (c) => Math.round(c.h),
getColor: (c, v) => ({
...c,
h: Number(v)
}),
localeKey: "hueInput"
}, {
label: "S",
max: 1,
step: 0.01,
getValue: (c) => Math.round(c.s * 100) / 100,
getColor: (c, v) => ({
...c,
s: Number(v)
}),
localeKey: "saturationInput"
}, {
label: "L",
max: 1,
step: 0.01,
getValue: (c) => Math.round(c.l * 100) / 100,
getColor: (c, v) => ({
...c,
l: Number(v)
}),
localeKey: "lightnessInput"
}, {
label: "A",
max: 1,
step: 0.01,
getValue: (_ref2) => {
let {
a
} = _ref2;
return a != null ? Math.round(a * 100) / 100 : 1;
},
getColor: (c, v) => ({
...c,
a: Number(v)
}),
localeKey: "alphaInput"
}],
to: HSVtoHSL,
from: HSLtoHSV
};
var hsl = {
...hsla,
inputs: hsla.inputs.slice(0, 3)
};
var hexa = {
inputProps: {
type: "text"
},
inputs: [{
label: "HEXA",
getValue: (c) => c,
getColor: (c, v) => v,
localeKey: "hexaInput"
}],
to: HSVtoHex,
from: HexToHSV
};
var hex = {
...hexa,
inputs: [{
label: "HEX",
getValue: (c) => c.slice(0, 7),
getColor: (c, v) => v,
localeKey: "hexInput"
}]
};
var modes = {
rgb,
rgba,
hsl,
hsla,
hex,
hexa
};
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerEdit.js
var VColorPickerInput = (_ref) => {
let {
label,
...rest
} = _ref;
return createBaseVNode("div", {
"class": "v-color-picker-edit__input"
}, [createBaseVNode("input", normalizeProps(guardReactiveProps(rest)), null), createBaseVNode("span", null, [label])]);
};
var makeVColorPickerEditProps = propsFactory({
color: Object,
disabled: Boolean,
mode: {
type: String,
default: "rgba",
validator: (v) => Object.keys(modes).includes(v)
},
modes: {
type: Array,
default: () => Object.keys(modes),
validator: (v) => Array.isArray(v) && v.every((m) => Object.keys(modes).includes(m))
},
...makeComponentProps()
}, "VColorPickerEdit");
var VColorPickerEdit = defineComponent({
name: "VColorPickerEdit",
props: makeVColorPickerEditProps(),
emits: {
"update:color": (color) => true,
"update:mode": (mode) => true
},
setup(props, _ref2) {
let {
emit
} = _ref2;
const {
t
} = useLocale();
const enabledModes = computed(() => {
return props.modes.map((key) => ({
...modes[key],
name: key
}));
});
const inputs = computed(() => {
const mode = enabledModes.value.find((m) => m.name === props.mode);
if (!mode) return [];
const color = props.color ? mode.to(props.color) : null;
return mode.inputs?.map((_ref3) => {
let {
getValue,
getColor,
localeKey,
...inputProps
} = _ref3;
return {
...mode.inputProps,
...inputProps,
ariaLabel: t(`$vuetify.colorPicker.ariaLabel.${localeKey}`),
disabled: props.disabled,
value: color && getValue(color),
onChange: (e) => {
const target = e.target;
if (!target) return;
emit("update:color", mode.from(getColor(color ?? mode.to(nullColor), target.value)));
}
};
});
});
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-color-picker-edit", props.class]),
"style": normalizeStyle(props.style)
}, [inputs.value?.map((props2) => createVNode(VColorPickerInput, props2, null)), enabledModes.value.length > 1 && createVNode(VBtn, {
"icon": "$unfold",
"size": "x-small",
"variant": "plain",
"aria-label": t("$vuetify.colorPicker.ariaLabel.changeFormat"),
"onClick": () => {
const mi = enabledModes.value.findIndex((m) => m.name === props.mode);
emit("update:mode", enabledModes.value[(mi + 1) % enabledModes.value.length].name);
}
}, null)]));
return {};
}
});
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerPreview.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VColorPicker/VColorPickerPreview.css";
var makeVColorPickerPreviewProps = propsFactory({
color: {
type: Object
},
disabled: Boolean,
hideAlpha: Boolean,
hideEyeDropper: Boolean,
eyeDropperIcon: {
type: IconValue,
default: "$eyeDropper"
},
...makeComponentProps()
}, "VColorPickerPreview");
var VColorPickerPreview = defineComponent({
name: "VColorPickerPreview",
props: makeVColorPickerPreviewProps(),
emits: {
"update:color": (color) => true
},
setup(props, _ref) {
let {
emit
} = _ref;
const {
t
} = useLocale();
const abortController = new AbortController();
onUnmounted(() => abortController.abort());
async function openEyeDropper() {
if (!SUPPORTS_EYE_DROPPER || props.disabled) return;
const eyeDropper = new window.EyeDropper();
try {
const result = await eyeDropper.open({
signal: abortController.signal
});
const colorHexValue = RGBtoHSV(parseColor(result.sRGBHex));
emit("update:color", {
...props.color ?? nullColor,
...colorHexValue
});
} catch (e) {
}
}
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-color-picker-preview", {
"v-color-picker-preview--hide-alpha": props.hideAlpha
}, props.class]),
"style": normalizeStyle(props.style)
}, [SUPPORTS_EYE_DROPPER && !props.hideEyeDropper && createBaseVNode("div", {
"class": "v-color-picker-preview__eye-dropper",
"key": "eyeDropper"
}, [createVNode(VBtn, {
"aria-label": t("$vuetify.colorPicker.ariaLabel.eyedropper"),
"density": "comfortable",
"disabled": props.disabled,
"icon": props.eyeDropperIcon,
"variant": "plain",
"onClick": openEyeDropper
}, null)]), createBaseVNode("div", {
"class": "v-color-picker-preview__dot"
}, [createBaseVNode("div", {
"style": {
background: HSVtoCSS(props.color ?? nullColor)
}
}, null)]), createBaseVNode("div", {
"class": "v-color-picker-preview__sliders"
}, [createVNode(VSlider, {
"class": "v-color-picker-preview__track v-color-picker-preview__hue",
"aria-label": t("$vuetify.colorPicker.ariaLabel.hueSlider"),
"modelValue": props.color?.h,
"onUpdate:modelValue": (h) => emit("update:color", {
...props.color ?? nullColor,
h
}),
"step": 1,
"min": 0,
"max": 360,
"disabled": props.disabled,
"thumbSize": 14,
"trackSize": 8,
"trackFillColor": "white",
"hideDetails": true
}, null), !props.hideAlpha && createVNode(VSlider, {
"class": "v-color-picker-preview__track v-color-picker-preview__alpha",
"aria-label": t("$vuetify.colorPicker.ariaLabel.alphaSlider"),
"modelValue": props.color?.a ?? 1,
"onUpdate:modelValue": (a) => emit("update:color", {
...props.color ?? nullColor,
a
}),
"step": 0.01,
"min": 0,
"max": 1,
"disabled": props.disabled,
"thumbSize": 14,
"trackSize": 8,
"trackFillColor": "white",
"hideDetails": true
}, null)])]));
return {};
}
});
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerSwatches.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VColorPicker/VColorPickerSwatches.css";
// node_modules/vuetify/lib/util/colors.js
var red = {
base: "#f44336",
lighten5: "#ffebee",
lighten4: "#ffcdd2",
lighten3: "#ef9a9a",
lighten2: "#e57373",
lighten1: "#ef5350",
darken1: "#e53935",
darken2: "#d32f2f",
darken3: "#c62828",
darken4: "#b71c1c",
accent1: "#ff8a80",
accent2: "#ff5252",
accent3: "#ff1744",
accent4: "#d50000"
};
var pink = {
base: "#e91e63",
lighten5: "#fce4ec",
lighten4: "#f8bbd0",
lighten3: "#f48fb1",
lighten2: "#f06292",
lighten1: "#ec407a",
darken1: "#d81b60",
darken2: "#c2185b",
darken3: "#ad1457",
darken4: "#880e4f",
accent1: "#ff80ab",
accent2: "#ff4081",
accent3: "#f50057",
accent4: "#c51162"
};
var purple = {
base: "#9c27b0",
lighten5: "#f3e5f5",
lighten4: "#e1bee7",
lighten3: "#ce93d8",
lighten2: "#ba68c8",
lighten1: "#ab47bc",
darken1: "#8e24aa",
darken2: "#7b1fa2",
darken3: "#6a1b9a",
darken4: "#4a148c",
accent1: "#ea80fc",
accent2: "#e040fb",
accent3: "#d500f9",
accent4: "#aa00ff"
};
var deepPurple = {
base: "#673ab7",
lighten5: "#ede7f6",
lighten4: "#d1c4e9",
lighten3: "#b39ddb",
lighten2: "#9575cd",
lighten1: "#7e57c2",
darken1: "#5e35b1",
darken2: "#512da8",
darken3: "#4527a0",
darken4: "#311b92",
accent1: "#b388ff",
accent2: "#7c4dff",
accent3: "#651fff",
accent4: "#6200ea"
};
var indigo = {
base: "#3f51b5",
lighten5: "#e8eaf6",
lighten4: "#c5cae9",
lighten3: "#9fa8da",
lighten2: "#7986cb",
lighten1: "#5c6bc0",
darken1: "#3949ab",
darken2: "#303f9f",
darken3: "#283593",
darken4: "#1a237e",
accent1: "#8c9eff",
accent2: "#536dfe",
accent3: "#3d5afe",
accent4: "#304ffe"
};
var blue = {
base: "#2196f3",
lighten5: "#e3f2fd",
lighten4: "#bbdefb",
lighten3: "#90caf9",
lighten2: "#64b5f6",
lighten1: "#42a5f5",
darken1: "#1e88e5",
darken2: "#1976d2",
darken3: "#1565c0",
darken4: "#0d47a1",
accent1: "#82b1ff",
accent2: "#448aff",
accent3: "#2979ff",
accent4: "#2962ff"
};
var lightBlue = {
base: "#03a9f4",
lighten5: "#e1f5fe",
lighten4: "#b3e5fc",
lighten3: "#81d4fa",
lighten2: "#4fc3f7",
lighten1: "#29b6f6",
darken1: "#039be5",
darken2: "#0288d1",
darken3: "#0277bd",
darken4: "#01579b",
accent1: "#80d8ff",
accent2: "#40c4ff",
accent3: "#00b0ff",
accent4: "#0091ea"
};
var cyan = {
base: "#00bcd4",
lighten5: "#e0f7fa",
lighten4: "#b2ebf2",
lighten3: "#80deea",
lighten2: "#4dd0e1",
lighten1: "#26c6da",
darken1: "#00acc1",
darken2: "#0097a7",
darken3: "#00838f",
darken4: "#006064",
accent1: "#84ffff",
accent2: "#18ffff",
accent3: "#00e5ff",
accent4: "#00b8d4"
};
var teal = {
base: "#009688",
lighten5: "#e0f2f1",
lighten4: "#b2dfdb",
lighten3: "#80cbc4",
lighten2: "#4db6ac",
lighten1: "#26a69a",
darken1: "#00897b",
darken2: "#00796b",
darken3: "#00695c",
darken4: "#004d40",
accent1: "#a7ffeb",
accent2: "#64ffda",
accent3: "#1de9b6",
accent4: "#00bfa5"
};
var green = {
base: "#4caf50",
lighten5: "#e8f5e9",
lighten4: "#c8e6c9",
lighten3: "#a5d6a7",
lighten2: "#81c784",
lighten1: "#66bb6a",
darken1: "#43a047",
darken2: "#388e3c",
darken3: "#2e7d32",
darken4: "#1b5e20",
accent1: "#b9f6ca",
accent2: "#69f0ae",
accent3: "#00e676",
accent4: "#00c853"
};
var lightGreen = {
base: "#8bc34a",
lighten5: "#f1f8e9",
lighten4: "#dcedc8",
lighten3: "#c5e1a5",
lighten2: "#aed581",
lighten1: "#9ccc65",
darken1: "#7cb342",
darken2: "#689f38",
darken3: "#558b2f",
darken4: "#33691e",
accent1: "#ccff90",
accent2: "#b2ff59",
accent3: "#76ff03",
accent4: "#64dd17"
};
var lime = {
base: "#cddc39",
lighten5: "#f9fbe7",
lighten4: "#f0f4c3",
lighten3: "#e6ee9c",
lighten2: "#dce775",
lighten1: "#d4e157",
darken1: "#c0ca33",
darken2: "#afb42b",
darken3: "#9e9d24",
darken4: "#827717",
accent1: "#f4ff81",
accent2: "#eeff41",
accent3: "#c6ff00",
accent4: "#aeea00"
};
var yellow = {
base: "#ffeb3b",
lighten5: "#fffde7",
lighten4: "#fff9c4",
lighten3: "#fff59d",
lighten2: "#fff176",
lighten1: "#ffee58",
darken1: "#fdd835",
darken2: "#fbc02d",
darken3: "#f9a825",
darken4: "#f57f17",
accent1: "#ffff8d",
accent2: "#ffff00",
accent3: "#ffea00",
accent4: "#ffd600"
};
var amber = {
base: "#ffc107",
lighten5: "#fff8e1",
lighten4: "#ffecb3",
lighten3: "#ffe082",
lighten2: "#ffd54f",
lighten1: "#ffca28",
darken1: "#ffb300",
darken2: "#ffa000",
darken3: "#ff8f00",
darken4: "#ff6f00",
accent1: "#ffe57f",
accent2: "#ffd740",
accent3: "#ffc400",
accent4: "#ffab00"
};
var orange = {
base: "#ff9800",
lighten5: "#fff3e0",
lighten4: "#ffe0b2",
lighten3: "#ffcc80",
lighten2: "#ffb74d",
lighten1: "#ffa726",
darken1: "#fb8c00",
darken2: "#f57c00",
darken3: "#ef6c00",
darken4: "#e65100",
accent1: "#ffd180",
accent2: "#ffab40",
accent3: "#ff9100",
accent4: "#ff6d00"
};
var deepOrange = {
base: "#ff5722",
lighten5: "#fbe9e7",
lighten4: "#ffccbc",
lighten3: "#ffab91",
lighten2: "#ff8a65",
lighten1: "#ff7043",
darken1: "#f4511e",
darken2: "#e64a19",
darken3: "#d84315",
darken4: "#bf360c",
accent1: "#ff9e80",
accent2: "#ff6e40",
accent3: "#ff3d00",
accent4: "#dd2c00"
};
var brown = {
base: "#795548",
lighten5: "#efebe9",
lighten4: "#d7ccc8",
lighten3: "#bcaaa4",
lighten2: "#a1887f",
lighten1: "#8d6e63",
darken1: "#6d4c41",
darken2: "#5d4037",
darken3: "#4e342e",
darken4: "#3e2723"
};
var blueGrey = {
base: "#607d8b",
lighten5: "#eceff1",
lighten4: "#cfd8dc",
lighten3: "#b0bec5",
lighten2: "#90a4ae",
lighten1: "#78909c",
darken1: "#546e7a",
darken2: "#455a64",
darken3: "#37474f",
darken4: "#263238"
};
var grey = {
base: "#9e9e9e",
lighten5: "#fafafa",
lighten4: "#f5f5f5",
lighten3: "#eeeeee",
lighten2: "#e0e0e0",
lighten1: "#bdbdbd",
darken1: "#757575",
darken2: "#616161",
darken3: "#424242",
darken4: "#212121"
};
var shades = {
black: "#000000",
white: "#ffffff",
transparent: "#ffffff00"
};
var colors_default = {
red,
pink,
purple,
deepPurple,
indigo,
blue,
lightBlue,
cyan,
teal,
green,
lightGreen,
lime,
yellow,
amber,
orange,
deepOrange,
brown,
blueGrey,
grey,
shades
};
// node_modules/vuetify/lib/components/VColorPicker/VColorPickerSwatches.js
var makeVColorPickerSwatchesProps = propsFactory({
swatches: {
type: Array,
default: () => parseDefaultColors(colors_default)
},
disabled: Boolean,
color: Object,
maxHeight: [Number, String],
...makeComponentProps()
}, "VColorPickerSwatches");
function parseDefaultColors(colors) {
return Object.keys(colors).map((key) => {
const color = colors[key];
return color.base ? [color.base, color.darken4, color.darken3, color.darken2, color.darken1, color.lighten1, color.lighten2, color.lighten3, color.lighten4, color.lighten5] : [color.black, color.white, color.transparent];
});
}
var VColorPickerSwatches = defineComponent({
name: "VColorPickerSwatches",
props: makeVColorPickerSwatchesProps(),
emits: {
"update:color": (color) => true
},
setup(props, _ref) {
let {
emit
} = _ref;
function onSwatchClick(hsva) {
if (props.disabled || !hsva) {
return;
}
emit("update:color", hsva);
}
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-color-picker-swatches", props.class]),
"style": normalizeStyle([{
maxHeight: convertToUnit(props.maxHeight)
}, props.style])
}, [createBaseVNode("div", null, [props.swatches.map((swatch) => createBaseVNode("div", {
"class": "v-color-picker-swatches__swatch"
}, [swatch.map((color) => {
const rgba2 = parseColor(color);
const hsva = RGBtoHSV(rgba2);
const background = RGBtoCSS(rgba2);
return createBaseVNode("div", {
"class": normalizeClass(["v-color-picker-swatches__color", {
"v-color-picker-swatches__color--disabled": props.disabled
}]),
"onClick": () => onSwatchClick(hsva)
}, [createBaseVNode("div", {
"style": {
background
}
}, [props.color && deepEqual(props.color, hsva) ? createVNode(VIcon, {
"size": "x-small",
"icon": "$success",
"color": getContrast(color, "#FFFFFF") > 2 ? "white" : "black"
}, null) : void 0])]);
})]))])]));
return {};
}
});
// node_modules/vuetify/lib/labs/VPicker/VPicker.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/labs/VPicker/VPicker.css";
// node_modules/vuetify/lib/labs/VPicker/VPickerTitle.js
var VPickerTitle = createSimpleFunctional("v-picker-title");
// node_modules/vuetify/lib/labs/VPicker/VPicker.js
var makeVPickerProps = propsFactory({
bgColor: String,
divided: Boolean,
landscape: Boolean,
title: String,
hideHeader: Boolean,
hideTitle: Boolean,
...makeVSheetProps()
}, "VPicker");
var VPicker = genericComponent()({
name: "VPicker",
props: makeVPickerProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
useRender(() => {
const sheetProps = VSheet.filterProps(props);
const hasTitle = !props.hideTitle && !!(props.title || slots.title);
return createVNode(VSheet, mergeProps(sheetProps, {
"color": props.bgColor,
"class": ["v-picker", {
"v-picker--divided": props.divided,
"v-picker--landscape": props.landscape,
"v-picker--with-actions": !!slots.actions
}, props.class],
"style": props.style
}), {
default: () => [!props.hideHeader && createBaseVNode("div", {
"key": "header",
"class": normalizeClass(["v-picker__header-wrapper", backgroundColorClasses.value]),
"style": normalizeStyle([backgroundColorStyles.value])
}, [hasTitle && createVNode(VPickerTitle, {
"key": "picker-title"
}, {
default: () => [slots.title?.() ?? props.title]
}), slots.header && createBaseVNode("div", {
"class": "v-picker__header"
}, [slots.header()])]), createBaseVNode("div", {
"class": "v-picker__body"
}, [slots.default?.()]), slots.actions && createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
slim: true,
variant: "text"
}
}
}, {
default: () => [createBaseVNode("div", {
"class": "v-picker__actions"
}, [slots.actions()])]
})]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VColorPicker/VColorPicker.js
var makeVColorPickerProps = propsFactory({
canvasHeight: {
type: [String, Number],
default: 150
},
disabled: Boolean,
dotSize: {
type: [Number, String],
default: 10
},
hideCanvas: Boolean,
hideSliders: Boolean,
hideInputs: Boolean,
mode: {
type: String,
default: "rgba",
validator: (v) => Object.keys(modes).includes(v)
},
modes: {
type: Array,
default: () => Object.keys(modes),
validator: (v) => Array.isArray(v) && v.every((m) => Object.keys(modes).includes(m))
},
showSwatches: Boolean,
swatches: Array,
swatchesMaxHeight: {
type: [Number, String],
default: 150
},
modelValue: {
type: [Object, String]
},
...makeVPickerProps({
hideHeader: true
}),
...pick(makeVColorPickerPreviewProps(), ["hideEyeDropper", "eyeDropperIcon"])
}, "VColorPicker");
var VColorPicker = defineComponent({
name: "VColorPicker",
props: makeVColorPickerProps(),
emits: {
"update:modelValue": (color) => true,
"update:mode": (mode) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const mode = useProxiedModel(props, "mode");
const hue = ref(null);
const model = useProxiedModel(props, "modelValue", void 0, (v) => {
if (v == null || v === "") return null;
let c;
try {
c = RGBtoHSV(parseColor(v));
} catch (err) {
consoleWarn(err);
return null;
}
return c;
}, (v) => {
if (!v) return null;
return extractColor(v, props.modelValue);
});
const currentColor = computed(() => {
return model.value ? {
...model.value,
h: hue.value ?? model.value.h
} : null;
});
const {
rtlClasses
} = useRtl();
let externalChange = true;
watch(model, (v) => {
if (!externalChange) {
externalChange = true;
return;
}
if (!v) return;
hue.value = v.h;
}, {
immediate: true
});
const updateColor = (hsva) => {
externalChange = false;
hue.value = hsva.h;
model.value = hsva;
};
onBeforeMount(() => {
if (!props.modes.includes(mode.value)) mode.value = props.modes[0];
});
provideDefaults({
VSlider: {
color: void 0,
trackColor: void 0,
trackFillColor: void 0
}
});
useRender(() => {
const pickerProps = VPicker.filterProps(props);
return createVNode(VPicker, mergeProps(pickerProps, {
"class": ["v-color-picker", rtlClasses.value, props.class],
"style": [{
"--v-color-picker-color-hsv": HSVtoCSS({
...currentColor.value ?? nullColor,
a: 1
})
}, props.style]
}), {
...slots,
default: () => createBaseVNode(Fragment, null, [!props.hideCanvas && createVNode(VColorPickerCanvas, {
"key": "canvas",
"color": currentColor.value,
"onUpdate:color": updateColor,
"disabled": props.disabled,
"dotSize": props.dotSize,
"width": props.width,
"height": props.canvasHeight
}, null), (!props.hideSliders || !props.hideInputs) && createBaseVNode("div", {
"key": "controls",
"class": "v-color-picker__controls"
}, [!props.hideSliders && createVNode(VColorPickerPreview, {
"key": "preview",
"color": currentColor.value,
"onUpdate:color": updateColor,
"hideAlpha": !mode.value.endsWith("a"),
"disabled": props.disabled,
"hideEyeDropper": props.hideEyeDropper,
"eyeDropperIcon": props.eyeDropperIcon
}, null), !props.hideInputs && createVNode(VColorPickerEdit, {
"key": "edit",
"modes": props.modes,
"mode": mode.value,
"onUpdate:mode": (m) => mode.value = m,
"color": currentColor.value,
"onUpdate:color": updateColor,
"disabled": props.disabled
}, null)]), props.showSwatches && createVNode(VColorPickerSwatches, {
"key": "swatches",
"color": currentColor.value,
"onUpdate:color": updateColor,
"maxHeight": props.swatchesMaxHeight,
"swatches": props.swatches,
"disabled": props.disabled
}, null)])
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VConfirmEdit/VConfirmEdit.js
var makeVConfirmEditProps = propsFactory({
modelValue: null,
color: String,
cancelText: {
type: String,
default: "$vuetify.confirmEdit.cancel"
},
okText: {
type: String,
default: "$vuetify.confirmEdit.ok"
},
disabled: {
type: [Boolean, Array],
default: void 0
},
hideActions: Boolean
}, "VConfirmEdit");
var VConfirmEdit = genericComponent()({
name: "VConfirmEdit",
props: makeVConfirmEditProps(),
emits: {
cancel: () => true,
save: (value) => true,
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const model = useProxiedModel(props, "modelValue");
const internalModel = ref();
watchEffect(() => {
internalModel.value = structuredClone(deepToRaw(model.value));
});
const {
t
} = useLocale();
const isPristine = computed(() => {
return deepEqual(model.value, internalModel.value);
});
function isActionDisabled(action) {
if (typeof props.disabled === "boolean") {
return props.disabled;
}
if (Array.isArray(props.disabled)) {
return props.disabled.includes(action);
}
return isPristine.value;
}
const isSaveDisabled = computed(() => isActionDisabled("save"));
const isCancelDisabled = computed(() => isActionDisabled("cancel"));
function save() {
model.value = internalModel.value;
emit("save", internalModel.value);
}
function cancel() {
internalModel.value = structuredClone(deepToRaw(model.value));
emit("cancel");
}
function actions(actionsProps) {
return createBaseVNode(Fragment, null, [createVNode(VBtn, mergeProps({
"disabled": isCancelDisabled.value,
"variant": "text",
"color": props.color,
"onClick": cancel,
"text": t(props.cancelText)
}, actionsProps), null), createVNode(VBtn, mergeProps({
"disabled": isSaveDisabled.value,
"variant": "text",
"color": props.color,
"onClick": save,
"text": t(props.okText)
}, actionsProps), null)]);
}
let actionsUsed = false;
useRender(() => {
return createBaseVNode(Fragment, null, [slots.default?.({
model: internalModel,
save,
cancel,
isPristine: isPristine.value,
get actions() {
actionsUsed = true;
return actions;
}
}), !props.hideActions && !actionsUsed && actions()]);
});
return {
save,
cancel,
isPristine
};
}
});
// node_modules/vuetify/lib/components/VDataIterator/composables/items.js
var makeDataIteratorItemsProps = propsFactory({
items: {
type: Array,
default: () => []
},
itemValue: {
type: [String, Array, Function],
default: "id"
},
itemSelectable: {
type: [String, Array, Function],
default: null
},
returnObject: Boolean
}, "DataIterator-items");
function transformItem(props, item) {
const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue);
const selectable = getPropertyFromItem(item, props.itemSelectable, true);
return {
type: "item",
value,
selectable,
raw: item
};
}
function transformItems(props, items) {
const array = [];
for (const item of items) {
array.push(transformItem(props, item));
}
return array;
}
function useDataIteratorItems(props) {
const items = computed(() => transformItems(props, props.items));
return {
items
};
}
// node_modules/vuetify/lib/components/VDataIterator/VDataIterator.js
var makeVDataIteratorProps = propsFactory({
search: String,
loading: Boolean,
...makeComponentProps(),
...makeDataIteratorItemsProps(),
...makeDataTableSelectProps(),
...makeDataTableSortProps(),
...makeDataTablePaginateProps({
itemsPerPage: 5
}),
...makeDataTableExpandProps(),
...makeDataTableGroupProps(),
...makeFilterProps(),
...makeTagProps(),
...makeTransitionProps({
transition: {
component: VFadeTransition,
hideOnLeave: true
}
})
}, "VDataIterator");
var VDataIterator = genericComponent()({
name: "VDataIterator",
props: makeVDataIteratorProps(),
emits: {
"update:modelValue": (value) => true,
"update:groupBy": (value) => true,
"update:page": (value) => true,
"update:itemsPerPage": (value) => true,
"update:sortBy": (value) => true,
"update:options": (value) => true,
"update:expanded": (value) => true,
"update:currentItems": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const groupBy = useProxiedModel(props, "groupBy");
const search = toRef(() => props.search);
const {
items
} = useDataIteratorItems(props);
const {
filteredItems
} = useFilter(props, items, search, {
transform: (item) => item.raw
});
const {
initialSortOrder,
sortBy,
multiSort,
mustSort
} = createSort(props);
const {
page,
itemsPerPage
} = createPagination(props);
const {
toggleSort
} = provideSort({
initialSortOrder,
sortBy,
multiSort,
mustSort,
page
});
const {
sortByWithGroups,
opened,
extractRows,
isGroupOpen,
toggleGroup
} = provideGroupBy({
groupBy,
sortBy
});
const {
sortedItems
} = useSortedItems(props, filteredItems, sortByWithGroups, {
transform: (item) => item.raw
});
const {
flatItems
} = useGroupedItems(sortedItems, groupBy, opened, false);
const itemsLength = toRef(() => flatItems.value.length);
const {
startIndex,
stopIndex,
pageCount,
prevPage,
nextPage,
setItemsPerPage,
setPage
} = providePagination({
page,
itemsPerPage,
itemsLength
});
const {
paginatedItems
} = usePaginatedItems({
items: flatItems,
startIndex,
stopIndex,
itemsPerPage
});
const paginatedItemsWithoutGroups = computed(() => extractRows(paginatedItems.value));
const {
isSelected,
select,
selectAll,
toggleSelect
} = provideSelection(props, {
allItems: items,
currentPage: paginatedItemsWithoutGroups
});
const {
isExpanded,
toggleExpand
} = provideExpanded(props);
useOptions({
page,
itemsPerPage,
sortBy,
groupBy,
search
});
const slotProps = computed(() => ({
page: page.value,
itemsPerPage: itemsPerPage.value,
sortBy: sortBy.value,
pageCount: pageCount.value,
toggleSort,
prevPage,
nextPage,
setPage,
setItemsPerPage,
isSelected,
select,
selectAll,
toggleSelect,
isExpanded,
toggleExpand,
isGroupOpen,
toggleGroup,
items: paginatedItemsWithoutGroups.value,
itemsCount: filteredItems.value.length,
groupedItems: paginatedItems.value
}));
useRender(() => createVNode(props.tag, {
"class": normalizeClass(["v-data-iterator", {
"v-data-iterator--loading": props.loading
}, props.class]),
"style": normalizeStyle(props.style)
}, {
default: () => [slots.header?.(slotProps.value), createVNode(MaybeTransition, {
"transition": props.transition
}, {
default: () => [props.loading ? createVNode(LoaderSlot, {
"key": "loader",
"name": "v-data-iterator",
"active": true
}, {
default: (slotProps2) => slots.loader?.(slotProps2)
}) : createBaseVNode("div", {
"key": "items"
}, [!paginatedItems.value.length ? slots["no-data"]?.() : slots.default?.(slotProps.value)])]
}), slots.footer?.(slotProps.value)]
}));
return {};
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePicker.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePicker.css";
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerControls.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePickerControls.css";
var makeVDatePickerControlsProps = propsFactory({
active: {
type: [String, Array],
default: void 0
},
controlHeight: [Number, String],
controlVariant: {
type: String,
default: "docked"
},
noMonthPicker: Boolean,
disabled: {
type: [Boolean, String, Array],
default: null
},
nextIcon: {
type: IconValue,
default: "$next"
},
prevIcon: {
type: IconValue,
default: "$prev"
},
modeIcon: {
type: IconValue,
default: "$subgroup"
},
text: String,
monthText: String,
yearText: String,
viewMode: {
type: String,
default: "month"
}
}, "VDatePickerControls");
var VDatePickerControls = genericComponent()({
name: "VDatePickerControls",
props: makeVDatePickerControlsProps(),
emits: {
"click:year": () => true,
"click:month": () => true,
"click:prev": () => true,
"click:next": () => true,
"click:prev-year": () => true,
"click:next-year": () => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
t
} = useLocale();
const disableMonth = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("text") : !!props.disabled;
});
const disableYear = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("mode") : !!props.disabled;
});
const disablePrevMonth = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("prev-month") : !!props.disabled;
});
const disableNextMonth = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("next-month") : !!props.disabled;
});
const disablePrevYear = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("prev-year") : !!props.disabled;
});
const disableNextYear = computed(() => {
return Array.isArray(props.disabled) ? props.disabled.includes("next-year") : !!props.disabled;
});
function onClickPrevMonth() {
emit("click:prev");
}
function onClickNextMonth() {
emit("click:next");
}
function onClickPrevYear() {
emit("click:prev-year");
}
function onClickNextYear() {
emit("click:next-year");
}
function onClickYear() {
emit("click:year");
}
function onClickMonth() {
emit("click:month");
}
useRender(() => {
const innerDefaults = {
VBtn: {
density: "comfortable",
variant: "text"
}
};
const prevMonth = createVNode(VBtn, {
"data-testid": "prev-month",
"disabled": disablePrevMonth.value,
"icon": props.prevIcon,
"aria-label": t("$vuetify.datePicker.ariaLabel.previousMonth"),
"onClick": onClickPrevMonth
}, null);
const nextMonth = createVNode(VBtn, {
"data-testid": "next-month",
"disabled": disableNextMonth.value,
"icon": props.nextIcon,
"aria-label": t("$vuetify.datePicker.ariaLabel.nextMonth"),
"onClick": onClickNextMonth
}, null);
const prevYear = createVNode(VBtn, {
"data-testid": "prev-year",
"disabled": disablePrevYear.value,
"icon": props.prevIcon,
"aria-label": t("$vuetify.datePicker.ariaLabel.previousYear"),
"onClick": onClickPrevYear
}, null);
const nextYear = createVNode(VBtn, {
"data-testid": "next-year",
"disabled": disableNextYear.value,
"icon": props.nextIcon,
"aria-label": t("$vuetify.datePicker.ariaLabel.nextYear"),
"onClick": onClickNextYear
}, null);
const onlyMonthBtn = createVNode(VBtn, {
"class": "v-date-picker-controls__only-month-btn",
"data-testid": "month-btn",
"density": "default",
"disabled": disableMonth.value,
"text": props.monthText,
"appendIcon": props.modeIcon,
"rounded": true,
"aria-label": t("$vuetify.datePicker.ariaLabel.selectMonth"),
"onClick": onClickMonth
}, null);
const onlyYearBtn = createVNode(VBtn, {
"class": "v-date-picker-controls__only-year-btn",
"data-testid": "year-btn",
"density": "default",
"disabled": disableYear.value,
"text": props.yearText,
"appendIcon": props.modeIcon,
"rounded": true,
"aria-label": t("$vuetify.datePicker.ariaLabel.selectYear"),
"onClick": onClickYear
}, null);
const monthYearBtn = createVNode(VBtn, {
"class": "v-date-picker-controls__year-btn",
"data-testid": "year-btn",
"density": "default",
"disabled": disableYear.value,
"text": props.text,
"appendIcon": props.modeIcon,
"rounded": true,
"aria-label": t("$vuetify.datePicker.ariaLabel.selectYear"),
"onClick": onClickYear
}, null);
const monthYearSplit = createBaseVNode(Fragment, null, [createVNode(VBtn, {
"class": "v-date-picker-controls__month-btn",
"data-testid": "month-btn",
"height": "36",
"disabled": disableMonth.value,
"text": props.text,
"rounded": true,
"aria-label": t("$vuetify.datePicker.ariaLabel.selectMonth"),
"onClick": onClickMonth
}, null), createVNode(VBtn, {
"class": "v-date-picker-controls__mode-btn",
"data-testid": "year-btn",
"disabled": disableYear.value,
"icon": props.modeIcon,
"aria-label": t("$vuetify.datePicker.ariaLabel.selectYear"),
"onClick": onClickYear
}, null)]);
const slotProps = {
viewMode: props.viewMode,
disabled: Array.isArray(props.disabled) ? props.disabled : [],
monthYearText: props.text ?? "",
monthText: props.monthText ?? "",
yearText: props.yearText ?? "",
openMonths: onClickMonth,
openYears: onClickYear,
prevMonth: onClickPrevMonth,
nextMonth: onClickNextMonth,
prevYear: onClickPrevYear,
nextYear: onClickNextYear
};
const modalControls = createBaseVNode(Fragment, null, [props.noMonthPicker ? monthYearBtn : monthYearSplit, createVNode(VSpacer, null, null), createBaseVNode("div", {
"class": "v-date-picker-controls__month"
}, [prevMonth, nextMonth])]);
const dockedControls = createBaseVNode(Fragment, null, [createBaseVNode("div", {
"class": "v-date-picker-controls__month"
}, [prevMonth, onlyMonthBtn, nextMonth]), createVNode(VSpacer, null, null), createBaseVNode("div", {
"class": "v-date-picker-controls__year"
}, [prevYear, onlyYearBtn, nextYear])]);
return createVNode(VDefaultsProvider, {
"defaults": innerDefaults
}, {
default: () => [createBaseVNode("div", {
"class": normalizeClass(["v-date-picker-controls", `v-date-picker-controls--variant-${props.controlVariant}`]),
"style": {
"--v-date-picker-controls-height": convertToUnit(props.controlHeight)
}
}, [slots.default?.(slotProps) ?? createBaseVNode(Fragment, null, [props.controlVariant === "modal" && modalControls, props.controlVariant === "docked" && dockedControls])])]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerHeader.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePickerHeader.css";
var makeVDatePickerHeaderProps = propsFactory({
appendIcon: IconValue,
color: String,
header: String,
transition: String,
onClick: EventProp()
}, "VDatePickerHeader");
var VDatePickerHeader = genericComponent()({
name: "VDatePickerHeader",
props: makeVDatePickerHeaderProps(),
emits: {
click: () => true,
"click:append": () => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
function onClick() {
emit("click");
}
function onClickAppend() {
emit("click:append");
}
useRender(() => {
const hasContent = !!(slots.default || props.header);
const hasAppend = !!(slots.append || props.appendIcon);
return createBaseVNode("div", {
"class": normalizeClass(["v-date-picker-header", {
"v-date-picker-header--clickable": !!props.onClick
}, backgroundColorClasses.value]),
"style": normalizeStyle(backgroundColorStyles.value),
"onClick": onClick
}, [slots.prepend && createBaseVNode("div", {
"key": "prepend",
"class": "v-date-picker-header__prepend"
}, [slots.prepend()]), hasContent && createVNode(MaybeTransition, {
"key": "content",
"name": props.transition
}, {
default: () => [createBaseVNode("div", {
"key": props.header,
"class": "v-date-picker-header__content"
}, [slots.default?.() ?? props.header])]
}), hasAppend && createBaseVNode("div", {
"class": "v-date-picker-header__append"
}, [!slots.append ? createVNode(VBtn, {
"key": "append-btn",
"icon": props.appendIcon,
"variant": "text",
"onClick": onClickAppend
}, null) : createVNode(VDefaultsProvider, {
"key": "append-defaults",
"disabled": !props.appendIcon,
"defaults": {
VBtn: {
icon: props.appendIcon,
variant: "text"
}
}
}, {
default: () => [slots.append?.()]
})])]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonth.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonth.css";
// node_modules/vuetify/lib/composables/calendar.js
var makeCalendarProps = propsFactory({
allowedDates: [Array, Function],
disabled: {
type: Boolean,
default: null
},
displayValue: null,
modelValue: Array,
month: [Number, String],
max: null,
min: null,
showAdjacentMonths: Boolean,
year: [Number, String],
weekdays: {
type: Array,
default: () => [0, 1, 2, 3, 4, 5, 6]
},
weeksInMonth: {
type: String,
default: "dynamic"
},
firstDayOfWeek: {
type: [Number, String],
default: void 0
},
firstDayOfYear: {
type: [Number, String],
default: void 0
},
weekdayFormat: String
}, "calendar");
function useCalendar(props) {
const adapter = useDate();
const model = useProxiedModel(props, "modelValue", [], (v) => wrapInArray(v).map((i) => adapter.date(i)));
const displayValue = computed(() => {
if (props.displayValue) return adapter.date(props.displayValue);
if (model.value.length > 0) return adapter.date(model.value[0]);
if (props.min) return adapter.date(props.min);
if (Array.isArray(props.allowedDates)) return adapter.date(props.allowedDates[0]);
return adapter.date();
});
const year = useProxiedModel(props, "year", void 0, (v) => {
const value = v != null ? Number(v) : adapter.getYear(displayValue.value);
return adapter.startOfYear(adapter.setYear(adapter.date(), value));
}, (v) => adapter.getYear(v));
const month = useProxiedModel(props, "month", void 0, (v) => {
const value = v != null ? Number(v) : adapter.getMonth(displayValue.value);
const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
return adapter.setMonth(date, value);
}, (v) => adapter.getMonth(v));
const weekdayLabels = computed(() => {
const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
return adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).filter((_, i) => props.weekdays.includes((i + firstDayOfWeek) % 7));
});
const weeksInMonth = computed(() => {
const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek);
const days = weeks.flat();
const daysInMonth3 = 6 * 7;
if (props.weeksInMonth === "static" && days.length < daysInMonth3) {
const lastDay = days[days.length - 1];
let week = [];
for (let day = 1; day <= daysInMonth3 - days.length; day++) {
week.push(adapter.addDays(lastDay, day));
if (day % 7 === 0) {
weeks.push(week);
week = [];
}
}
}
return weeks;
});
function genDays(days, today) {
return days.filter((date) => {
return props.weekdays.includes(adapter.toJsDate(date).getDay());
}).map((date, index) => {
const isoDate = adapter.toISO(date);
const isAdjacent = !adapter.isSameMonth(date, month.value);
const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value));
const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value));
const isSame = adapter.isSameDay(date, month.value);
const weekdaysCount = props.weekdays.length;
return {
date,
formatted: adapter.format(date, "keyboardDate"),
isAdjacent,
isDisabled: isDisabled(date),
isEnd,
isHidden: isAdjacent && !props.showAdjacentMonths,
isSame,
isSelected: model.value.some((value) => adapter.isSameDay(date, value)),
isStart,
isToday: adapter.isSameDay(date, today),
isWeekEnd: index % weekdaysCount === weekdaysCount - 1,
isWeekStart: index % weekdaysCount === 0,
isoDate,
localized: adapter.format(date, "dayOfMonth"),
month: adapter.getMonth(date),
year: adapter.getYear(date)
};
});
}
const daysInWeek = computed(() => {
const lastDay = adapter.startOfWeek(displayValue.value, props.firstDayOfWeek);
const week = [];
for (let day = 0; day <= 6; day++) {
week.push(adapter.addDays(lastDay, day));
}
const today = adapter.date();
return genDays(week, today);
});
const daysInMonth2 = computed(() => {
const days = weeksInMonth.value.flat();
const today = adapter.date();
return genDays(days, today);
});
const weekNumbers = computed(() => {
return weeksInMonth.value.map((week) => {
return week.length ? adapter.getWeek(week[0], props.firstDayOfWeek, props.firstDayOfYear) : null;
});
});
const {
minDate,
maxDate
} = useCalendarRange(props);
function isDisabled(value) {
if (props.disabled) return true;
const date = adapter.date(value);
if (minDate.value && adapter.isBefore(adapter.endOfDay(date), minDate.value)) return true;
if (maxDate.value && adapter.isAfter(date, maxDate.value)) return true;
if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) {
return !props.allowedDates.some((d) => adapter.isSameDay(adapter.date(d), date));
}
if (typeof props.allowedDates === "function") {
return !props.allowedDates(date);
}
return false;
}
return {
displayValue,
daysInMonth: daysInMonth2,
daysInWeek,
genDays,
model,
weeksInMonth,
weekdayLabels,
weekNumbers
};
}
function useCalendarRange(props) {
const adapter = useDate();
const minDate = computed(() => {
if (!props.min) return null;
const date = adapter.date(props.min);
return adapter.isValid(date) ? date : null;
});
const maxDate = computed(() => {
if (!props.max) return null;
const date = adapter.date(props.max);
return adapter.isValid(date) ? date : null;
});
function clampDate(date) {
if (minDate.value && adapter.isBefore(date, minDate.value)) {
return minDate.value;
}
if (maxDate.value && adapter.isAfter(date, maxDate.value)) {
return maxDate.value;
}
return date;
}
function isInAllowedRange(date) {
return (!minDate.value || adapter.isAfter(date, minDate.value)) && (!maxDate.value || adapter.isBefore(date, maxDate.value));
}
return {
minDate,
maxDate,
clampDate,
isInAllowedRange
};
}
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonth.js
var makeVDatePickerMonthProps = propsFactory({
color: String,
hideWeekdays: Boolean,
multiple: [Boolean, Number, String],
showWeek: Boolean,
transition: {
type: String,
default: "picker-transition"
},
reverseTransition: {
type: String,
default: "picker-reverse-transition"
},
events: {
type: [Array, Function, Object],
default: () => null
},
eventColor: {
type: [Array, Function, Object, String],
default: () => null
},
...omit(makeCalendarProps(), ["displayValue"])
}, "VDatePickerMonth");
var VDatePickerMonth = genericComponent()({
name: "VDatePickerMonth",
props: makeVDatePickerMonthProps(),
emits: {
"update:modelValue": (date) => true,
"update:month": (date) => true,
"update:year": (date) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const daysRef = ref();
const {
t
} = useLocale();
const {
daysInMonth: daysInMonth2,
model,
weekNumbers,
weekdayLabels
} = useCalendar(props);
const adapter = useDate();
const rangeStart = shallowRef();
const rangeStop = shallowRef();
const isReverse = shallowRef(false);
const transition = toRef(() => {
return !isReverse.value ? props.transition : props.reverseTransition;
});
if (props.multiple === "range" && model.value.length > 0) {
rangeStart.value = model.value[0];
if (model.value.length > 1) {
rangeStop.value = model.value[model.value.length - 1];
}
}
const atMax = computed(() => {
const max = ["number", "string"].includes(typeof props.multiple) ? Number(props.multiple) : Infinity;
return model.value.length >= max;
});
watch(daysInMonth2, (val, oldVal) => {
if (!oldVal) return;
isReverse.value = adapter.isBefore(val[0].date, oldVal[0].date);
});
function onRangeClick(value) {
const _value = adapter.startOfDay(value);
if (model.value.length === 0) {
rangeStart.value = void 0;
} else if (model.value.length === 1) {
rangeStart.value = model.value[0];
rangeStop.value = void 0;
}
if (!rangeStart.value) {
rangeStart.value = _value;
model.value = [rangeStart.value];
} else if (!rangeStop.value) {
if (adapter.isSameDay(_value, rangeStart.value)) {
rangeStart.value = void 0;
model.value = [];
return;
} else if (adapter.isBefore(_value, rangeStart.value)) {
rangeStop.value = adapter.endOfDay(rangeStart.value);
rangeStart.value = _value;
} else {
rangeStop.value = adapter.endOfDay(_value);
}
model.value = createDateRange(adapter, rangeStart.value, rangeStop.value);
} else {
rangeStart.value = value;
rangeStop.value = void 0;
model.value = [rangeStart.value];
}
}
function getDateAriaLabel(item) {
const fullDate = adapter.format(item.date, "fullDateWithWeekday");
const localeKey = item.isToday ? "currentDate" : "selectDate";
return t(`$vuetify.datePicker.ariaLabel.${localeKey}`, fullDate);
}
function onMultipleClick(value) {
const index = model.value.findIndex((selection) => adapter.isSameDay(selection, value));
if (index === -1) {
model.value = [...model.value, value];
} else {
const value2 = [...model.value];
value2.splice(index, 1);
model.value = value2;
}
}
function onClick(value) {
if (props.multiple === "range") {
onRangeClick(value);
} else if (props.multiple) {
onMultipleClick(value);
} else {
model.value = [value];
}
}
function getEventColors(date) {
const {
events,
eventColor
} = props;
let eventData;
let eventColors = [];
if (Array.isArray(events)) {
eventData = events.includes(date);
} else if (events instanceof Function) {
eventData = events(date) || false;
} else if (events) {
eventData = events[date] || false;
} else {
eventData = false;
}
if (!eventData) {
return [];
} else if (eventData !== true) {
eventColors = wrapInArray(eventData);
} else if (typeof eventColor === "string") {
eventColors = [eventColor];
} else if (typeof eventColor === "function") {
eventColors = wrapInArray(eventColor(date));
} else if (Array.isArray(eventColor)) {
eventColors = eventColor;
} else if (typeof eventColor === "object" && eventColor !== null) {
eventColors = wrapInArray(eventColor[date]);
}
return !eventColors.length ? ["surface-variant"] : eventColors.filter(Boolean).map((color) => typeof color === "string" ? color : "surface-variant");
}
function genEvents(date) {
const eventColors = getEventColors(date);
if (!eventColors.length) return null;
return createBaseVNode("div", {
"class": "v-date-picker-month__events"
}, [eventColors.map((color) => createVNode(VBadge, {
"dot": true,
"color": color
}, null))]);
}
useRender(() => createBaseVNode("div", {
"class": "v-date-picker-month",
"style": {
"--v-date-picker-days-in-week": props.weekdays.length
}
}, [props.showWeek && createBaseVNode("div", {
"key": "weeks",
"class": "v-date-picker-month__weeks"
}, [!props.hideWeekdays && createBaseVNode("div", {
"key": "hide-week-days",
"class": "v-date-picker-month__day"
}, [createTextVNode(" ")]), weekNumbers.value.map((week) => createBaseVNode("div", {
"class": normalizeClass(["v-date-picker-month__day", "v-date-picker-month__day--adjacent"])
}, [week]))]), createVNode(MaybeTransition, {
"name": transition.value
}, {
default: () => [createBaseVNode("div", {
"ref": daysRef,
"key": daysInMonth2.value[0].date?.toString(),
"class": "v-date-picker-month__days"
}, [!props.hideWeekdays && weekdayLabels.value.map((weekDay) => createBaseVNode("div", {
"class": normalizeClass(["v-date-picker-month__day", "v-date-picker-month__weekday"])
}, [weekDay])), daysInMonth2.value.map((item, i) => {
const slotProps = {
props: {
class: "v-date-picker-month__day-btn",
color: item.isSelected || item.isToday ? props.color : void 0,
disabled: item.isDisabled,
icon: true,
ripple: false,
variant: item.isSelected ? "flat" : item.isToday ? "outlined" : "text",
"aria-label": getDateAriaLabel(item),
"aria-current": item.isToday ? "date" : void 0,
onClick: () => onClick(item.date)
},
item,
i
};
if (atMax.value && !item.isSelected) {
item.isDisabled = true;
}
return createBaseVNode("div", {
"class": normalizeClass(["v-date-picker-month__day", {
"v-date-picker-month__day--adjacent": item.isAdjacent,
"v-date-picker-month__day--hide-adjacent": item.isHidden,
"v-date-picker-month__day--selected": item.isSelected,
"v-date-picker-month__day--week-end": item.isWeekEnd,
"v-date-picker-month__day--week-start": item.isWeekStart
}]),
"data-v-date": !item.isDisabled ? item.isoDate : void 0
}, [(props.showAdjacentMonths || !item.isAdjacent) && (slots.day?.(slotProps) ?? createVNode(VBtn, slotProps.props, {
default: () => [item.localized, genEvents(item.isoDate)]
}))]);
})])]
})]));
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonths.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonths.css";
var makeVDatePickerMonthsProps = propsFactory({
color: String,
height: [String, Number],
min: null,
max: null,
modelValue: Number,
year: Number,
allowedMonths: [Array, Function]
}, "VDatePickerMonths");
var VDatePickerMonths = genericComponent()({
name: "VDatePickerMonths",
props: makeVDatePickerMonthsProps(),
emits: {
"update:modelValue": (date) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const adapter = useDate();
const model = useProxiedModel(props, "modelValue");
const months = computed(() => {
let date = adapter.startOfYear(adapter.date());
if (props.year) {
date = adapter.setYear(date, props.year);
}
return createRange(12).map((i) => {
const text = adapter.format(date, "monthShort");
const label = adapter.format(date, "month");
const isDisabled = !!(!isMonthAllowed(i) || props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
date = adapter.getNextMonth(date);
return {
isDisabled,
text,
label,
value: i
};
});
});
watchEffect(() => {
model.value = model.value ?? adapter.getMonth(adapter.date());
});
function isMonthAllowed(month) {
if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
return props.allowedMonths.includes(month);
}
if (typeof props.allowedMonths === "function") {
return props.allowedMonths(month);
}
return true;
}
useRender(() => createBaseVNode("div", {
"class": "v-date-picker-months",
"style": {
height: convertToUnit(props.height)
}
}, [createBaseVNode("div", {
"class": "v-date-picker-months__content"
}, [months.value.map((month, i) => {
const btnProps = {
active: model.value === i,
ariaLabel: month.label,
color: model.value === i ? props.color : void 0,
disabled: month.isDisabled,
rounded: true,
text: month.text,
variant: model.value === month.value ? "flat" : "text",
onClick: () => onClick(i)
};
function onClick(i2) {
if (model.value === i2) {
emit("update:modelValue", model.value);
return;
}
model.value = i2;
}
return slots.month?.({
month,
i,
props: btnProps
}) ?? createVNode(VBtn, mergeProps({
"key": "month"
}, btnProps), null);
})])]));
return {};
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePickerYears.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VDatePicker/VDatePickerYears.css";
var makeVDatePickerYearsProps = propsFactory({
color: String,
height: [String, Number],
min: null,
max: null,
modelValue: Number,
allowedYears: [Array, Function]
}, "VDatePickerYears");
var VDatePickerYears = genericComponent()({
name: "VDatePickerYears",
props: makeVDatePickerYearsProps(),
directives: {
vIntersect: intersect_default
},
emits: {
"update:modelValue": (year) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const adapter = useDate();
const model = useProxiedModel(props, "modelValue");
const hasFocusedItem = shallowRef(false);
const years = computed(() => {
const year = adapter.getYear(adapter.date());
let min = year - 100;
let max = year + 52;
if (props.min) {
min = adapter.getYear(adapter.date(props.min));
}
if (props.max) {
max = adapter.getYear(adapter.date(props.max));
}
let date = adapter.startOfYear(adapter.date());
date = adapter.setYear(date, min);
return createRange(max - min + 1, min).map((i) => {
const text = adapter.format(date, "year");
date = adapter.setYear(date, adapter.getYear(date) + 1);
return {
text,
value: i,
isDisabled: !isYearAllowed(i)
};
});
});
watchEffect(() => {
model.value = model.value ?? adapter.getYear(adapter.date());
});
const yearRef = templateRef();
function focusSelectedYear() {
yearRef.el?.scrollIntoView({
block: "center"
});
}
function isYearAllowed(year) {
if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
return props.allowedYears.includes(year);
}
if (typeof props.allowedYears === "function") {
return props.allowedYears(year);
}
return true;
}
useRender(() => withDirectives(createBaseVNode("div", {
"class": "v-date-picker-years",
"style": {
height: convertToUnit(props.height)
}
}, [createBaseVNode("div", {
"class": "v-date-picker-years__content",
"onFocus": () => yearRef.el?.focus(),
"onFocusin": () => hasFocusedItem.value = true,
"onFocusout": () => hasFocusedItem.value = false,
"tabindex": hasFocusedItem.value ? -1 : 0
}, [years.value.map((year, i) => {
const btnProps = {
ref: model.value === year.value ? yearRef : void 0,
active: model.value === year.value,
color: model.value === year.value ? props.color : void 0,
rounded: true,
text: year.text,
disabled: year.isDisabled,
variant: model.value === year.value ? "flat" : "text",
onClick: () => {
if (model.value === year.value) {
emit("update:modelValue", model.value);
return;
}
model.value = year.value;
}
};
return slots.year?.({
year,
i,
props: btnProps
}) ?? createVNode(VBtn, mergeProps({
"key": "month"
}, btnProps), null);
})])]), [[intersect_default, {
handler: focusSelectedYear
}, null, {
once: true
}]]));
return {};
}
});
// node_modules/vuetify/lib/components/VDatePicker/VDatePicker.js
var makeVDatePickerProps = propsFactory({
// TODO: implement in v3.5
// calendarIcon: {
// type: String,
// default: '$calendar',
// },
// keyboardIcon: {
// type: String,
// default: '$edit',
// },
// inputMode: {
// type: String as PropType<'calendar' | 'keyboard'>,
// default: 'calendar',
// },
// inputText: {
// type: String,
// default: '$vuetify.datePicker.input.placeholder',
// },
// inputPlaceholder: {
// type: String,
// default: 'dd/mm/yyyy',
// },
header: {
type: String,
default: "$vuetify.datePicker.header"
},
headerColor: String,
headerDateFormat: {
type: String,
default: "normalDateWithWeekday"
},
landscapeHeaderWidth: [Number, String],
...omit(makeVDatePickerControlsProps(), ["active", "monthText", "yearText"]),
...makeVDatePickerMonthProps({
weeksInMonth: "static"
}),
...omit(makeVDatePickerMonthsProps(), ["modelValue"]),
...omit(makeVDatePickerYearsProps(), ["modelValue"]),
...makeVPickerProps({
title: "$vuetify.datePicker.title"
}),
modelValue: null
}, "VDatePicker");
var VDatePicker = genericComponent()({
name: "VDatePicker",
props: makeVDatePickerProps(),
emits: {
"update:modelValue": (date) => true,
"update:month": (date) => true,
"update:year": (date) => true,
// 'update:inputMode': (date: any) => true,
"update:viewMode": (date) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const adapter = useDate();
const {
t
} = useLocale();
const {
rtlClasses
} = useRtl();
const model = useProxiedModel(props, "modelValue", void 0, (v) => wrapInArray(v).map((i) => adapter.date(i)), (v) => props.multiple ? v : v[0]);
const viewMode = useProxiedModel(props, "viewMode");
const {
minDate,
maxDate,
clampDate
} = useCalendarRange(props);
const internal = computed(() => {
const today = adapter.date();
const value = model.value?.[0] ? adapter.date(model.value[0]) : clampDate(today);
return value && adapter.isValid(value) ? value : today;
});
const headerColor = toRef(() => props.headerColor ?? props.color);
const _month = useProxiedModel(props, "month");
const month = computed({
get: () => Number(_month.value ?? adapter.getMonth(adapter.startOfMonth(internal.value))),
set: (v) => _month.value = v
});
const _year = useProxiedModel(props, "year");
const year = computed({
get: () => Number(_year.value ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value)))),
set: (v) => _year.value = v
});
const isReversing = shallowRef(false);
const header = computed(() => {
if (props.multiple && model.value.length > 1) {
return t("$vuetify.datePicker.itemsSelected", model.value.length);
}
const formattedDate = model.value[0] && adapter.isValid(model.value[0]) ? adapter.format(adapter.date(model.value[0]), props.headerDateFormat) : t(props.header);
return props.landscape && formattedDate.split(" ").length === 3 ? formattedDate.replace(" ", "\n") : formattedDate;
});
const monthStart = toRef(() => {
let date = adapter.date();
date = adapter.setDate(date, 1);
date = adapter.setMonth(date, month.value);
date = adapter.setYear(date, year.value);
return date;
});
const monthYearText = toRef(() => adapter.format(monthStart.value, "monthAndYear"));
const monthText = toRef(() => adapter.format(monthStart.value, "monthShort"));
const yearText = toRef(() => adapter.format(monthStart.value, "year"));
const headerTransition = toRef(() => `date-picker-header${isReversing.value ? "-reverse" : ""}-transition`);
const disabled = computed(() => {
if (props.disabled) return true;
const targets = [];
if (viewMode.value !== "month") {
targets.push(...["prev-month", "next-month", "prev-year", "next-year"]);
} else {
let _date = adapter.date();
_date = adapter.startOfMonth(_date);
_date = adapter.setMonth(_date, month.value);
_date = adapter.setYear(_date, year.value);
if (minDate.value) {
const prevMonthEnd = adapter.addDays(adapter.startOfMonth(_date), -1);
const prevYearEnd = adapter.addDays(adapter.startOfYear(_date), -1);
adapter.isAfter(minDate.value, prevMonthEnd) && targets.push("prev-month");
adapter.isAfter(minDate.value, prevYearEnd) && targets.push("prev-year");
}
if (maxDate.value) {
const nextMonthStart = adapter.addDays(adapter.endOfMonth(_date), 1);
const nextYearStart = adapter.addDays(adapter.endOfYear(_date), 1);
adapter.isAfter(nextMonthStart, maxDate.value) && targets.push("next-month");
adapter.isAfter(nextYearStart, maxDate.value) && targets.push("next-year");
}
}
return targets;
});
const allowedYears = computed(() => {
return props.allowedYears || isYearAllowed;
});
const allowedMonths = computed(() => {
return props.allowedMonths || isMonthAllowed;
});
function isAllowedInRange(start, end) {
const allowedDates = props.allowedDates;
if (typeof allowedDates !== "function") return true;
const days = 1 + daysDiff(adapter, start, end);
for (let i = 0; i < days; i++) {
if (allowedDates(adapter.addDays(start, i))) return true;
}
return false;
}
function isYearAllowed(year2) {
if (typeof props.allowedDates === "function") {
const startOfYear = adapter.parseISO(`${year2}-01-01`);
return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
}
if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
for (const date of props.allowedDates) {
if (adapter.getYear(adapter.date(date)) === year2) return true;
}
return false;
}
return true;
}
function isMonthAllowed(month2) {
if (typeof props.allowedDates === "function") {
const monthTwoDigits = String(month2 + 1).padStart(2, "0");
const startOfMonth = adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);
return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
}
if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
for (const date of props.allowedDates) {
if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month2) return true;
}
return false;
}
return true;
}
function onClickNextMonth() {
if (month.value < 11) {
month.value++;
} else {
year.value++;
month.value = 0;
onUpdateYear();
}
onUpdateMonth();
}
function onClickPrevMonth() {
if (month.value > 0) {
month.value--;
} else {
year.value--;
month.value = 11;
onUpdateYear();
}
onUpdateMonth();
}
function onClickNextYear() {
year.value++;
if (maxDate.value) {
const monthTwoDigits = String(month.value + 1).padStart(2, "0");
const monthStart2 = adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);
if (adapter.isAfter(monthStart2, maxDate.value)) {
month.value = adapter.getMonth(maxDate.value);
}
}
onUpdateYear();
}
function onClickPrevYear() {
year.value--;
if (minDate.value) {
const monthTwoDigits = String(month.value + 1).padStart(2, "0");
const monthStart2 = adapter.endOfMonth(adapter.parseISO(`${year.value}-${monthTwoDigits}-01`));
if (adapter.isAfter(minDate.value, monthStart2)) {
month.value = adapter.getMonth(minDate.value);
}
}
onUpdateYear();
}
function onClickDate() {
viewMode.value = "month";
}
function onClickMonth() {
viewMode.value = viewMode.value === "months" ? "month" : "months";
}
function onClickYear() {
viewMode.value = viewMode.value === "year" ? "month" : "year";
}
function onUpdateMonth() {
if (viewMode.value === "months") onClickMonth();
}
function onUpdateYear() {
if (viewMode.value === "year") onClickYear();
}
watch(model, (val, oldVal) => {
const arrBefore = wrapInArray(oldVal);
const arrAfter = wrapInArray(val);
if (!arrAfter.length) return;
const before = adapter.date(arrBefore[arrBefore.length - 1]);
const after = adapter.date(arrAfter[arrAfter.length - 1]);
if (adapter.isSameDay(before, after)) return;
const newMonth = adapter.getMonth(after);
const newYear = adapter.getYear(after);
if (newMonth !== month.value) {
month.value = newMonth;
onUpdateMonth();
}
if (newYear !== year.value) {
year.value = newYear;
onUpdateYear();
}
isReversing.value = adapter.isBefore(before, after);
});
useRender(() => {
const pickerProps = VPicker.filterProps(props);
const datePickerControlsProps = omit(VDatePickerControls.filterProps(props), ["viewMode"]);
const datePickerHeaderProps = VDatePickerHeader.filterProps(props);
const datePickerMonthProps = VDatePickerMonth.filterProps(props);
const datePickerMonthsProps = omit(VDatePickerMonths.filterProps(props), ["modelValue"]);
const datePickerYearsProps = omit(VDatePickerYears.filterProps(props), ["modelValue"]);
const headerProps = {
color: headerColor.value,
header: header.value,
transition: headerTransition.value
};
return createVNode(VPicker, mergeProps(pickerProps, {
"color": headerColor.value,
"class": ["v-date-picker", `v-date-picker--${viewMode.value}`, {
"v-date-picker--show-week": props.showWeek
}, rtlClasses.value, props.class],
"style": [{
"--v-date-picker-landscape-header-width": convertToUnit(props.landscapeHeaderWidth)
}, props.style]
}), {
title: () => slots.title?.() ?? createBaseVNode("div", {
"class": "v-date-picker__title"
}, [t(props.title)]),
header: () => slots.header ? createVNode(VDefaultsProvider, {
"defaults": {
VDatePickerHeader: {
...headerProps
}
}
}, {
default: () => [slots.header?.(headerProps)]
}) : createVNode(VDatePickerHeader, mergeProps({
"key": "header"
}, datePickerHeaderProps, headerProps, {
"onClick": viewMode.value !== "month" ? onClickDate : void 0
}), {
prepend: slots.prepend,
append: slots.append
}),
default: () => createBaseVNode(Fragment, null, [createVNode(VDatePickerControls, mergeProps(datePickerControlsProps, {
"disabled": disabled.value,
"viewMode": viewMode.value,
"text": monthYearText.value,
"monthText": monthText.value,
"yearText": yearText.value,
"onClick:next": onClickNextMonth,
"onClick:prev": onClickPrevMonth,
"onClick:nextYear": onClickNextYear,
"onClick:prevYear": onClickPrevYear,
"onClick:month": onClickMonth,
"onClick:year": onClickYear
}), {
default: slots.controls
}), createVNode(VFadeTransition, {
"hideOnLeave": true
}, {
default: () => [viewMode.value === "months" ? createVNode(VDatePickerMonths, mergeProps({
"key": "date-picker-months"
}, datePickerMonthsProps, {
"modelValue": month.value,
"onUpdate:modelValue": [($event) => month.value = $event, onUpdateMonth],
"min": minDate.value,
"max": maxDate.value,
"year": year.value,
"allowedMonths": allowedMonths.value
}), {
month: slots.month
}) : viewMode.value === "year" ? createVNode(VDatePickerYears, mergeProps({
"key": "date-picker-years"
}, datePickerYearsProps, {
"modelValue": year.value,
"onUpdate:modelValue": [($event) => year.value = $event, onUpdateYear],
"min": minDate.value,
"max": maxDate.value,
"allowedYears": allowedYears.value
}), {
year: slots.year
}) : createVNode(VDatePickerMonth, mergeProps({
"key": "date-picker-month"
}, datePickerMonthProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"month": month.value,
"onUpdate:month": [($event) => month.value = $event, onUpdateMonth],
"year": year.value,
"onUpdate:year": [($event) => year.value = $event, onUpdateYear],
"min": minDate.value,
"max": maxDate.value
}), {
day: slots.day
})]
})]),
actions: slots.actions
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VEmptyState/VEmptyState.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VEmptyState/VEmptyState.css";
var makeVEmptyStateProps = propsFactory({
actionText: String,
bgColor: String,
color: String,
icon: IconValue,
image: String,
justify: {
type: String,
default: "center"
},
headline: String,
title: String,
text: String,
textWidth: {
type: [Number, String],
default: 500
},
href: String,
to: String,
...makeComponentProps(),
...makeDimensionProps(),
...makeSizeProps({
size: void 0
}),
...makeThemeProps()
}, "VEmptyState");
var VEmptyState = genericComponent()({
name: "VEmptyState",
props: makeVEmptyStateProps(),
emits: {
"click:action": (e) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.bgColor);
const {
dimensionStyles
} = useDimension(props);
const {
displayClasses
} = useDisplay();
function onClickAction(e) {
emit("click:action", e);
}
useRender(() => {
const hasActions = !!(slots.actions || props.actionText);
const hasHeadline = !!(slots.headline || props.headline);
const hasTitle = !!(slots.title || props.title);
const hasText = !!(slots.text || props.text);
const hasMedia = !!(slots.media || props.image || props.icon);
const size = props.size || (props.image ? 200 : 96);
return createBaseVNode("div", {
"class": normalizeClass(["v-empty-state", {
[`v-empty-state--${props.justify}`]: true
}, themeClasses.value, backgroundColorClasses.value, displayClasses.value, props.class]),
"style": normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style])
}, [hasMedia && createBaseVNode("div", {
"key": "media",
"class": "v-empty-state__media"
}, [!slots.media ? createBaseVNode(Fragment, null, [props.image ? createVNode(VImg, {
"key": "image",
"src": props.image,
"height": size
}, null) : props.icon ? createVNode(VIcon, {
"key": "icon",
"color": props.color,
"size": size,
"icon": props.icon
}, null) : void 0]) : createVNode(VDefaultsProvider, {
"key": "media-defaults",
"defaults": {
VImg: {
src: props.image,
height: size
},
VIcon: {
size,
icon: props.icon
}
}
}, {
default: () => [slots.media()]
})]), hasHeadline && createBaseVNode("div", {
"key": "headline",
"class": "v-empty-state__headline"
}, [slots.headline?.() ?? props.headline]), hasTitle && createBaseVNode("div", {
"key": "title",
"class": "v-empty-state__title"
}, [slots.title?.() ?? props.title]), hasText && createBaseVNode("div", {
"key": "text",
"class": "v-empty-state__text",
"style": {
maxWidth: convertToUnit(props.textWidth)
}
}, [slots.text?.() ?? props.text]), slots.default && createBaseVNode("div", {
"key": "content",
"class": "v-empty-state__content"
}, [slots.default()]), hasActions && createBaseVNode("div", {
"key": "actions",
"class": "v-empty-state__actions"
}, [createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
class: "v-empty-state__action-btn",
color: props.color ?? "surface-variant",
href: props.href,
text: props.actionText,
to: props.to
}
}
}, {
default: () => [slots.actions?.({
props: {
onClick: onClickAction
}
}) ?? createVNode(VBtn, {
"onClick": onClickAction
}, null)]
})])]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VFab/VFab.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VFab/VFab.css";
var makeVFabProps = propsFactory({
app: Boolean,
appear: Boolean,
extended: Boolean,
layout: Boolean,
offset: Boolean,
modelValue: {
type: Boolean,
default: true
},
...omit(makeVBtnProps({
active: true
}), ["location", "spaced"]),
...makeLayoutItemProps(),
...makeLocationProps(),
...makeTransitionProps({
transition: "fab-transition"
})
}, "VFab");
var VFab = genericComponent()({
name: "VFab",
props: makeVFabProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const model = useProxiedModel(props, "modelValue");
const height = shallowRef(56);
const layoutItemStyles = ref();
const {
resizeRef
} = useResizeObserver((entries) => {
if (!entries.length) return;
height.value = entries[0].target.clientHeight;
});
const hasPosition = toRef(() => props.app || props.absolute);
const position = computed(() => {
if (!hasPosition.value) return false;
return props.location?.split(" ").shift() ?? "bottom";
});
const orientation = computed(() => {
if (!hasPosition.value) return false;
return props.location?.split(" ")[1] ?? "end";
});
useToggleScope(() => props.app, () => {
const layout = useLayoutItem({
id: props.name,
order: computed(() => parseInt(props.order, 10)),
position,
layoutSize: computed(() => props.layout ? height.value + 24 : 0),
elementSize: computed(() => height.value + 24),
active: computed(() => props.app && model.value),
absolute: toRef(() => props.absolute)
});
watchEffect(() => {
layoutItemStyles.value = layout.layoutItemStyles.value;
});
});
const vFabRef = ref();
useRender(() => {
const btnProps = VBtn.filterProps(props);
return createBaseVNode("div", {
"ref": vFabRef,
"class": normalizeClass(["v-fab", {
"v-fab--absolute": props.absolute,
"v-fab--app": !!props.app,
"v-fab--extended": props.extended,
"v-fab--offset": props.offset,
[`v-fab--${position.value}`]: hasPosition.value,
[`v-fab--${orientation.value}`]: hasPosition.value
}, props.class]),
"style": normalizeStyle([props.app ? {
...layoutItemStyles.value
} : {
height: props.absolute ? "100%" : "inherit"
}, props.style])
}, [createBaseVNode("div", {
"class": "v-fab__container"
}, [createVNode(MaybeTransition, {
"appear": props.appear,
"transition": props.transition
}, {
default: () => [withDirectives(createVNode(VBtn, mergeProps({
"ref": resizeRef
}, btnProps, {
"active": void 0,
"location": void 0
}), slots), [[vShow, props.active]])]
})])]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VFooter/VFooter.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VFooter/VFooter.css";
var makeVFooterProps = propsFactory({
app: Boolean,
color: String,
height: {
type: [Number, String],
default: "auto"
},
...makeBorderProps(),
...makeComponentProps(),
...makeElevationProps(),
...makeLayoutItemProps(),
...makeRoundedProps(),
...makeTagProps({
tag: "footer"
}),
...makeThemeProps()
}, "VFooter");
var VFooter = genericComponent()({
name: "VFooter",
props: makeVFooterProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const layoutItemStyles = ref();
const {
themeClasses
} = provideTheme(props);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const {
borderClasses
} = useBorder(props);
const {
elevationClasses
} = useElevation(props);
const {
roundedClasses
} = useRounded(props);
const autoHeight = shallowRef(32);
const {
resizeRef
} = useResizeObserver((entries) => {
if (!entries.length) return;
autoHeight.value = entries[0].target.clientHeight;
});
const height = computed(() => props.height === "auto" ? autoHeight.value : parseInt(props.height, 10));
useToggleScope(() => props.app, () => {
const layout = useLayoutItem({
id: props.name,
order: computed(() => parseInt(props.order, 10)),
position: toRef(() => "bottom"),
layoutSize: height,
elementSize: computed(() => props.height === "auto" ? void 0 : height.value),
active: toRef(() => props.app),
absolute: toRef(() => props.absolute)
});
watchEffect(() => {
layoutItemStyles.value = layout.layoutItemStyles.value;
});
});
useRender(() => createVNode(props.tag, {
"ref": resizeRef,
"class": normalizeClass(["v-footer", themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
"style": normalizeStyle([backgroundColorStyles.value, props.app ? layoutItemStyles.value : {
height: convertToUnit(props.height)
}, props.style])
}, slots));
return {};
}
});
// node_modules/vuetify/lib/components/VHotkey/VHotkey.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VHotkey/VHotkey.css";
// node_modules/vuetify/lib/components/VKbd/index.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VKbd/VKbd.css";
// node_modules/vuetify/lib/components/VKbd/VKbd.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VKbd/VKbd.css";
var makeVKbdProps = propsFactory({
color: String,
...makeBorderProps(),
...makeComponentProps(),
...makeRoundedProps(),
...makeTagProps({
tag: "kbd"
}),
...makeThemeProps(),
...makeElevationProps()
}, "VKbd");
var VKbd = genericComponent()({
name: "VKbd",
props: makeVKbdProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
borderClasses
} = useBorder(props);
const {
roundedClasses
} = useRounded(props);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const {
elevationClasses
} = useElevation(props);
useRender(() => createVNode(props.tag, {
"class": normalizeClass(["v-kbd", themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
"style": normalizeStyle([backgroundColorStyles.value, props.style])
}, slots));
return {};
}
});
// node_modules/vuetify/lib/components/VHotkey/VHotkey.js
function processKey(config, requestedMode, isMac) {
const keyCfg = isMac && config.mac ? config.mac : config.default;
const mode = (() => {
if (requestedMode === "icon" && !keyCfg.icon) return "text";
if (requestedMode === "symbol" && !keyCfg.symbol) return "text";
return requestedMode;
})();
let value = keyCfg[mode] ?? keyCfg.text;
if (mode === "text" && typeof value === "string" && value.startsWith("$") && !value.startsWith("$vuetify.")) {
value = value.slice(1).toUpperCase();
}
return mode === "icon" ? ["icon", value] : [mode, value];
}
var hotkeyMap = {
ctrl: {
mac: {
symbol: "⌃",
icon: "$ctrl",
text: "$vuetify.hotkey.ctrl"
},
default: {
text: "Ctrl"
}
},
meta: {
mac: {
symbol: "⌘",
icon: "$command",
text: "$vuetify.hotkey.command"
},
default: {
text: "Ctrl"
}
},
cmd: {
mac: {
symbol: "⌘",
icon: "$command",
text: "$vuetify.hotkey.command"
},
default: {
text: "Ctrl"
}
},
shift: {
mac: {
symbol: "⇧",
icon: "$shift",
text: "$vuetify.hotkey.shift"
},
default: {
text: "Shift"
}
},
alt: {
mac: {
symbol: "⌥",
icon: "$alt",
text: "$vuetify.hotkey.option"
},
default: {
text: "Alt"
}
},
enter: {
default: {
symbol: "↵",
icon: "$enter",
text: "$vuetify.hotkey.enter"
}
},
arrowup: {
default: {
symbol: "↑",
icon: "$arrowup",
text: "$vuetify.hotkey.upArrow"
}
},
arrowdown: {
default: {
symbol: "↓",
icon: "$arrowdown",
text: "$vuetify.hotkey.downArrow"
}
},
arrowleft: {
default: {
symbol: "←",
icon: "$arrowleft",
text: "$vuetify.hotkey.leftArrow"
}
},
arrowright: {
default: {
symbol: "→",
icon: "$arrowright",
text: "$vuetify.hotkey.rightArrow"
}
},
backspace: {
default: {
symbol: "⌫",
icon: "$backspace",
text: "$vuetify.hotkey.backspace"
}
},
escape: {
default: {
text: "$vuetify.hotkey.escape"
}
},
" ": {
mac: {
symbol: "␣",
icon: "$space",
text: "$vuetify.hotkey.space"
},
default: {
text: "$vuetify.hotkey.space"
}
},
"-": {
default: {
text: "-"
}
}
};
var makeVHotkeyProps = propsFactory({
// String representing keyboard shortcuts (e.g., "ctrl+k", "meta+shift+p")
keys: String,
// How to display keys: 'symbol' uses special characters (⌘, ⌃), 'icon' uses SVG icons, 'text' uses words
displayMode: {
type: String,
default: "icon"
},
// Custom key mapping configuration. Users can import and modify the exported hotkeyMap as needed
keyMap: {
type: Object,
default: () => hotkeyMap
},
platform: {
type: String,
default: "auto"
},
inline: Boolean,
disabled: Boolean,
prefix: String,
suffix: String,
variant: {
type: String,
default: "elevated",
validator: (v) => ["elevated", "flat", "tonal", "outlined", "text", "plain", "contained"].includes(v)
},
...makeComponentProps(),
...makeThemeProps(),
...makeBorderProps(),
...makeRoundedProps(),
...makeElevationProps(),
color: String
}, "VHotkey");
var AND_DELINEATOR = /* @__PURE__ */ Symbol("VHotkey:AND_DELINEATOR");
var SLASH_DELINEATOR = /* @__PURE__ */ Symbol("VHotkey:SLASH_DELINEATOR");
var THEN_DELINEATOR = /* @__PURE__ */ Symbol("VHotkey:THEN_DELINEATOR");
function getKeyText(keyMap, key, isMac) {
const lowerKey = key.toLowerCase();
if (lowerKey in keyMap) {
const result = processKey(keyMap[lowerKey], "text", isMac);
return typeof result[1] === "string" ? result[1] : String(result[1]);
}
return key.toUpperCase();
}
function applyDisplayModeToKey(keyMap, mode, key, isMac) {
const lowerKey = key.toLowerCase();
if (lowerKey in keyMap) {
const result = processKey(keyMap[lowerKey], mode, isMac);
if (result[0] === "text" && typeof result[1] === "string" && result[1].startsWith("$") && !result[1].startsWith("$vuetify.")) {
return ["text", result[1].replace("$", "").toUpperCase(), key];
}
return [...result, key];
}
return ["text", key.toUpperCase(), key];
}
var VHotkey = genericComponent()({
name: "VHotkey",
props: makeVHotkeyProps(),
setup(props) {
const {
t
} = useLocale();
const {
themeClasses
} = provideTheme(props);
const {
rtlClasses
} = useRtl();
const {
borderClasses
} = useBorder(props);
const {
roundedClasses
} = useRounded(props);
const {
elevationClasses
} = useElevation(props);
const {
colorClasses,
colorStyles,
variantClasses
} = useVariant(() => ({
color: props.color,
variant: props.variant === "contained" ? "elevated" : props.variant
}));
const isMac = computed(() => props.platform === "auto" ? typeof navigator !== "undefined" && /macintosh/i.test(navigator.userAgent) : props.platform === "mac");
const keyCombinations = computed(() => {
if (!props.keys) return [];
return props.keys.split(" ").map((combination) => {
const result = [];
const sequenceGroups = splitKeySequence(combination);
for (let i = 0; i < sequenceGroups.length; i++) {
const group = sequenceGroups[i];
if (i > 0) result.push(THEN_DELINEATOR);
const {
keys: keyParts,
separators
} = splitKeyCombination(group);
for (let j = 0; j < keyParts.length; j++) {
const part = keyParts[j];
if (j > 0) {
result.push(separators[j - 1] === "/" ? SLASH_DELINEATOR : AND_DELINEATOR);
}
result.push(applyDisplayModeToKey(props.keyMap, props.displayMode, part, isMac.value));
}
}
return result;
});
});
const accessibleLabel = computed(() => {
if (!props.keys) return "";
const readableShortcuts = keyCombinations.value.map((combination) => {
const readableParts = [];
for (const key of combination) {
if (Array.isArray(key)) {
const textKey = key[0] === "icon" || key[0] === "symbol" ? applyDisplayModeToKey(mergeDeep(hotkeyMap, props.keyMap), "text", String(key[1]), isMac.value)[1] : key[1];
readableParts.push(translateKey(textKey));
} else {
if (key === AND_DELINEATOR) {
readableParts.push(t("$vuetify.hotkey.plus"));
} else if (key === SLASH_DELINEATOR) {
readableParts.push(t("$vuetify.hotkey.or"));
} else if (key === THEN_DELINEATOR) {
readableParts.push(t("$vuetify.hotkey.then"));
}
}
}
return readableParts.join(" ");
});
const shortcutText = readableShortcuts.join(", ");
return t("$vuetify.hotkey.shortcut", shortcutText);
});
function translateKey(key) {
return key.startsWith("$vuetify.") ? t(key) : key;
}
function getKeyTooltip(key) {
if (props.displayMode === "text") return void 0;
const textKey = getKeyText(props.keyMap, String(key[2]), isMac.value);
return translateKey(textKey);
}
function renderKey(key, keyIndex) {
const isContained = props.variant === "contained";
const KeyComponent = isContained ? "kbd" : VKbd;
const keyClasses = ["v-hotkey__key", `v-hotkey__key-${key[0]}`, ...isContained ? ["v-hotkey__key--nested"] : [borderClasses.value, roundedClasses.value, elevationClasses.value, colorClasses.value]];
return createVNode(KeyComponent, {
"key": keyIndex,
"class": normalizeClass(keyClasses),
"style": normalizeStyle(isContained ? void 0 : colorStyles.value),
"aria-hidden": "true",
"title": getKeyTooltip(key)
}, {
default: () => [key[0] === "icon" ? createVNode(VIcon, {
"icon": key[1],
"aria-hidden": "true"
}, null) : translateKey(key[1])]
});
}
function renderDivider(key, keyIndex) {
return createBaseVNode("span", {
"key": keyIndex,
"class": "v-hotkey__divider",
"aria-hidden": "true"
}, [key === AND_DELINEATOR ? "+" : key === SLASH_DELINEATOR ? "/" : t("$vuetify.hotkey.then")]);
}
useRender(() => {
const content = createBaseVNode(Fragment, null, [props.prefix && createBaseVNode("span", {
"key": "prefix",
"class": "v-hotkey__prefix"
}, [props.prefix]), keyCombinations.value.map((combination, comboIndex) => createBaseVNode("span", {
"class": "v-hotkey__combination",
"key": comboIndex
}, [combination.map((key, keyIndex) => Array.isArray(key) ? renderKey(key, keyIndex) : renderDivider(key, keyIndex)), comboIndex < keyCombinations.value.length - 1 && createBaseVNode("span", {
"aria-hidden": "true"
}, [createTextVNode(" ")])])), props.suffix && createBaseVNode("span", {
"key": "suffix",
"class": "v-hotkey__suffix"
}, [props.suffix])]);
return createBaseVNode("div", {
"class": normalizeClass(["v-hotkey", {
"v-hotkey--disabled": props.disabled,
"v-hotkey--inline": props.inline,
"v-hotkey--contained": props.variant === "contained"
}, themeClasses.value, rtlClasses.value, variantClasses.value, props.class]),
"style": normalizeStyle(props.style),
"role": "img",
"aria-label": accessibleLabel.value
}, [props.variant !== "contained" ? content : createVNode(VKbd, {
"key": "contained",
"class": normalizeClass(["v-hotkey__contained-wrapper", borderClasses.value, roundedClasses.value, elevationClasses.value, colorClasses.value]),
"style": normalizeStyle(colorStyles.value),
"aria-hidden": "true"
}, {
default: () => [content]
})]);
});
}
});
// node_modules/vuetify/lib/components/VHover/VHover.js
var makeVHoverProps = propsFactory({
disabled: Boolean,
modelValue: {
type: Boolean,
default: null
},
...makeDelayProps()
}, "VHover");
var VHover = genericComponent()({
name: "VHover",
props: makeVHoverProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const isHovering = useProxiedModel(props, "modelValue");
const {
runOpenDelay,
runCloseDelay
} = useDelay(props, (value) => !props.disabled && (isHovering.value = value));
return () => slots.default?.({
isHovering: isHovering.value,
props: {
onMouseenter: runOpenDelay,
onMouseleave: runCloseDelay
}
});
}
});
// node_modules/vuetify/lib/components/VInfiniteScroll/VInfiniteScroll.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VInfiniteScroll/VInfiniteScroll.css";
var makeVInfiniteScrollProps = propsFactory({
color: String,
direction: {
type: String,
default: "vertical",
validator: (v) => ["vertical", "horizontal"].includes(v)
},
side: {
type: String,
default: "end",
validator: (v) => ["start", "end", "both"].includes(v)
},
mode: {
type: String,
default: "intersect",
validator: (v) => ["intersect", "manual"].includes(v)
},
margin: [Number, String],
loadMoreText: {
type: String,
default: "$vuetify.infiniteScroll.loadMore"
},
emptyText: {
type: String,
default: "$vuetify.infiniteScroll.empty"
},
...makeDimensionProps(),
...makeTagProps()
}, "VInfiniteScroll");
var VInfiniteScrollIntersect = defineComponent({
name: "VInfiniteScrollIntersect",
props: {
side: {
type: String,
required: true
},
rootMargin: String
},
emits: {
intersect: (side, isIntersecting) => true
},
setup(props, _ref) {
let {
emit
} = _ref;
const {
intersectionRef,
isIntersecting
} = useIntersectionObserver();
watch(isIntersecting, async (val) => {
emit("intersect", props.side, val);
});
useRender(() => createBaseVNode("div", {
"class": "v-infinite-scroll-intersect",
"style": {
"--v-infinite-margin-size": props.rootMargin
},
"ref": intersectionRef
}, [createTextVNode(" ")]));
return {};
}
});
var VInfiniteScroll = genericComponent()({
name: "VInfiniteScroll",
props: makeVInfiniteScrollProps(),
emits: {
load: (options) => true
},
setup(props, _ref2) {
let {
slots,
emit
} = _ref2;
const rootEl = ref();
const startStatus = shallowRef("ok");
const endStatus = shallowRef("ok");
const margin = computed(() => convertToUnit(props.margin));
const isIntersecting = shallowRef(false);
function setScrollAmount(amount) {
if (!rootEl.value) return;
const property = props.direction === "vertical" ? "scrollTop" : "scrollLeft";
rootEl.value[property] = amount;
}
function getScrollAmount() {
if (!rootEl.value) return 0;
const property = props.direction === "vertical" ? "scrollTop" : "scrollLeft";
return rootEl.value[property];
}
function getScrollSize() {
if (!rootEl.value) return 0;
const property = props.direction === "vertical" ? "scrollHeight" : "scrollWidth";
return rootEl.value[property];
}
function getContainerSize() {
if (!rootEl.value) return 0;
const property = props.direction === "vertical" ? "clientHeight" : "clientWidth";
return rootEl.value[property];
}
onMounted(() => {
if (!rootEl.value) return;
if (props.side === "start") {
setScrollAmount(getScrollSize());
} else if (props.side === "both") {
setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2);
}
});
function setStatus(side, status) {
if (side === "start") {
startStatus.value = status;
} else if (side === "end") {
endStatus.value = status;
} else if (side === "both") {
startStatus.value = status;
endStatus.value = status;
}
}
function getStatus(side) {
return side === "start" ? startStatus.value : endStatus.value;
}
let previousScrollSize = 0;
function handleIntersect(side, _isIntersecting) {
isIntersecting.value = _isIntersecting;
if (isIntersecting.value) {
intersecting(side);
}
}
function intersecting(side) {
if (props.mode !== "manual" && !isIntersecting.value) return;
const status = getStatus(side);
if (!rootEl.value || ["empty", "loading"].includes(status)) return;
previousScrollSize = getScrollSize();
setStatus(side, "loading");
function done(status2) {
setStatus(side, status2);
nextTick(() => {
if (status2 === "empty" || status2 === "error") return;
if (status2 === "ok" && side === "start") {
setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
}
if (props.mode !== "manual") {
nextTick(() => {
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
intersecting(side);
});
});
});
});
}
});
}
emit("load", {
side,
done
});
}
const {
t
} = useLocale();
function renderSide(side, status) {
if (props.side !== side && props.side !== "both") return;
const onClick = () => intersecting(side);
const slotProps = {
side,
props: {
onClick,
color: props.color
}
};
if (status === "error") return slots.error?.(slotProps);
if (status === "empty") return slots.empty?.(slotProps) ?? createBaseVNode("div", null, [t(props.emptyText)]);
if (props.mode === "manual") {
if (status === "loading") {
return slots.loading?.(slotProps) ?? createVNode(VProgressCircular, {
"indeterminate": true,
"color": props.color
}, null);
}
return slots["load-more"]?.(slotProps) ?? createVNode(VBtn, {
"variant": "outlined",
"color": props.color,
"onClick": onClick
}, {
default: () => [t(props.loadMoreText)]
});
}
return slots.loading?.(slotProps) ?? createVNode(VProgressCircular, {
"indeterminate": true,
"color": props.color
}, null);
}
const {
dimensionStyles
} = useDimension(props);
useRender(() => {
const Tag = props.tag;
const hasStartIntersect = props.side === "start" || props.side === "both";
const hasEndIntersect = props.side === "end" || props.side === "both";
const intersectMode = props.mode === "intersect";
return createVNode(Tag, {
"ref": rootEl,
"class": normalizeClass(["v-infinite-scroll", `v-infinite-scroll--${props.direction}`, {
"v-infinite-scroll--start": hasStartIntersect,
"v-infinite-scroll--end": hasEndIntersect
}]),
"style": normalizeStyle(dimensionStyles.value)
}, {
default: () => [createBaseVNode("div", {
"class": "v-infinite-scroll__side"
}, [renderSide("start", startStatus.value)]), hasStartIntersect && intersectMode && createVNode(VInfiniteScrollIntersect, {
"key": "start",
"side": "start",
"onIntersect": handleIntersect,
"rootMargin": margin.value
}, null), slots.default?.(), hasEndIntersect && intersectMode && createVNode(VInfiniteScrollIntersect, {
"key": "end",
"side": "end",
"onIntersect": handleIntersect,
"rootMargin": margin.value
}, null), createBaseVNode("div", {
"class": "v-infinite-scroll__side"
}, [renderSide("end", endStatus.value)])]
});
});
function reset(side) {
const effectiveSide = side ?? props.side;
setStatus(effectiveSide, "ok");
nextTick(() => {
if (effectiveSide !== "end") {
setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
}
if (props.mode !== "manual") {
nextTick(() => {
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
if (effectiveSide === "both") {
intersecting("start");
intersecting("end");
} else {
intersecting(effectiveSide);
}
});
});
});
});
}
});
}
return {
reset
};
}
});
// node_modules/vuetify/lib/components/VItemGroup/VItemGroup.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VItemGroup/VItemGroup.css";
var VItemGroupSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-item-group");
var makeVItemGroupProps = propsFactory({
...makeComponentProps(),
...makeGroupProps({
selectedClass: "v-item--selected"
}),
...makeTagProps(),
...makeThemeProps()
}, "VItemGroup");
var VItemGroup = genericComponent()({
name: "VItemGroup",
props: makeVItemGroupProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
isSelected,
select,
next,
prev,
selected
} = useGroup(props, VItemGroupSymbol);
return () => createVNode(props.tag, {
"class": normalizeClass(["v-item-group", themeClasses.value, props.class]),
"style": normalizeStyle(props.style)
}, {
default: () => [slots.default?.({
isSelected,
select,
next,
prev,
selected: selected.value
})]
});
}
});
// node_modules/vuetify/lib/components/VItemGroup/VItem.js
var VItem = genericComponent()({
name: "VItem",
props: makeGroupItemProps(),
emits: {
"group:selected": (val) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
isSelected,
select,
toggle,
selectedClass,
value,
disabled
} = useGroupItem(props, VItemGroupSymbol);
return () => slots.default?.({
isSelected: isSelected.value,
selectedClass: selectedClass.value,
select,
toggle,
value: value.value,
disabled: disabled.value
});
}
});
// node_modules/vuetify/lib/components/VLayout/VLayout.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VLayout/VLayout.css";
var makeVLayoutProps = propsFactory({
...makeComponentProps(),
...makeDimensionProps(),
...makeLayoutProps()
}, "VLayout");
var VLayout = genericComponent()({
name: "VLayout",
props: makeVLayoutProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
layoutClasses,
layoutStyles,
getLayoutItem,
items,
layoutRef
} = createLayout(props);
const {
dimensionStyles
} = useDimension(props);
useRender(() => createBaseVNode("div", {
"ref": layoutRef,
"class": normalizeClass([layoutClasses.value, props.class]),
"style": normalizeStyle([dimensionStyles.value, layoutStyles.value, props.style])
}, [slots.default?.()]));
return {
getLayoutItem,
items
};
}
});
// node_modules/vuetify/lib/components/VLayout/VLayoutItem.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VLayout/VLayoutItem.css";
var makeVLayoutItemProps = propsFactory({
position: {
type: String,
required: true
},
size: {
type: [Number, String],
default: 300
},
modelValue: Boolean,
...makeComponentProps(),
...makeLayoutItemProps()
}, "VLayoutItem");
var VLayoutItem = genericComponent()({
name: "VLayoutItem",
props: makeVLayoutItemProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
layoutItemStyles
} = useLayoutItem({
id: props.name,
order: computed(() => parseInt(props.order, 10)),
position: toRef(() => props.position),
elementSize: toRef(() => props.size),
layoutSize: toRef(() => props.size),
active: toRef(() => props.modelValue),
absolute: toRef(() => props.absolute)
});
return () => createBaseVNode("div", {
"class": normalizeClass(["v-layout-item", props.class]),
"style": normalizeStyle([layoutItemStyles.value, props.style])
}, [slots.default?.()]);
}
});
// node_modules/vuetify/lib/components/VLazy/VLazy.js
var makeVLazyProps = propsFactory({
modelValue: Boolean,
options: {
type: Object,
// For more information on types, navigate to:
// https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
default: () => ({
root: void 0,
rootMargin: void 0,
threshold: void 0
})
},
...makeComponentProps(),
...makeDimensionProps(),
...makeTagProps(),
...makeTransitionProps({
transition: "fade-transition"
})
}, "VLazy");
var VLazy = genericComponent()({
name: "VLazy",
directives: {
vIntersect: intersect_default
},
props: makeVLazyProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
dimensionStyles
} = useDimension(props);
const isActive = useProxiedModel(props, "modelValue");
function onIntersect(isIntersecting) {
if (isActive.value) return;
isActive.value = isIntersecting;
}
useRender(() => withDirectives(createVNode(props.tag, {
"class": normalizeClass(["v-lazy", props.class]),
"style": normalizeStyle([dimensionStyles.value, props.style])
}, {
default: () => [isActive.value && createVNode(MaybeTransition, {
"transition": props.transition,
"appear": true
}, {
default: () => [slots.default?.()]
})]
}), [[intersect_default, {
handler: onIntersect,
options: props.options
}, null]]));
return {};
}
});
// node_modules/vuetify/lib/components/VLocaleProvider/VLocaleProvider.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VLocaleProvider/VLocaleProvider.css";
var makeVLocaleProviderProps = propsFactory({
locale: String,
fallbackLocale: String,
messages: Object,
rtl: {
type: Boolean,
default: void 0
},
...makeComponentProps()
}, "VLocaleProvider");
var VLocaleProvider = genericComponent()({
name: "VLocaleProvider",
props: makeVLocaleProviderProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
rtlClasses
} = provideLocale(props);
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-locale-provider", rtlClasses.value, props.class]),
"style": normalizeStyle(props.style)
}, [slots.default?.()]));
return {};
}
});
// node_modules/vuetify/lib/components/VNoSsr/VNoSsr.js
var VNoSsr = defineComponent({
name: "VNoSsr",
setup(_, _ref) {
let {
slots
} = _ref;
const show = useHydration();
return () => show.value && slots.default?.();
}
});
// node_modules/vuetify/lib/components/VNumberInput/VNumberInput.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VNumberInput/VNumberInput.css";
// node_modules/vuetify/lib/components/VNumberInput/hold.js
var HOLD_REPEAT = 50;
var HOLD_DELAY = 500;
function useHold(_ref) {
let {
toggleUpDown
} = _ref;
let timeout = -1;
let interval = -1;
onScopeDispose(holdStop);
function holdStart(value) {
holdStop();
tick(value);
window.addEventListener("pointerup", holdStop);
document.addEventListener("blur", holdStop);
timeout = window.setTimeout(() => {
interval = window.setInterval(() => tick(value), HOLD_REPEAT);
}, HOLD_DELAY);
}
function holdStop() {
window.clearTimeout(timeout);
window.clearInterval(interval);
window.removeEventListener("pointerup", holdStop);
document.removeEventListener("blur", holdStop);
}
onScopeDispose(holdStop);
function tick(value) {
toggleUpDown(value === "up");
}
return {
holdStart,
holdStop
};
}
// node_modules/vuetify/lib/components/VNumberInput/VNumberInput.js
var makeVNumberInputProps = propsFactory({
controlVariant: {
type: String,
default: "default"
},
inset: Boolean,
hideInput: Boolean,
modelValue: {
type: Number,
default: null
},
min: {
type: Number,
default: Number.MIN_SAFE_INTEGER
},
max: {
type: Number,
default: Number.MAX_SAFE_INTEGER
},
step: {
type: Number,
default: 1
},
precision: {
type: Number,
default: 0
},
minFractionDigits: {
type: Number,
default: null
},
decimalSeparator: {
type: String,
validator: (v) => !v || v.length === 1
},
...omit(makeVTextFieldProps(), ["modelValue", "validationValue"])
}, "VNumberInput");
var VNumberInput = genericComponent()({
name: "VNumberInput",
props: {
...makeVNumberInputProps()
},
emits: {
"update:focused": (val) => true,
"update:modelValue": (val) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const vTextFieldRef = ref();
const {
holdStart,
holdStop
} = useHold({
toggleUpDown
});
const form = useForm(props);
const controlsDisabled = computed(() => form.isDisabled.value || form.isReadonly.value);
const isFocused = shallowRef(props.focused);
const {
decimalSeparator: decimalSeparatorFromLocale
} = useLocale();
const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
function correctPrecision(val) {
let precision = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : props.precision;
let trim = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
const fixed = precision == null ? String(val) : val.toFixed(precision);
if (isFocused.value && trim) {
return Number(fixed).toString().replace(".", decimalSeparator.value);
}
if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
return fixed.replace(".", decimalSeparator.value);
}
let [baseDigits, fractionDigits] = fixed.split(".");
fractionDigits = (fractionDigits ?? "").padEnd(props.minFractionDigits, "0").replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0+$`, "g"), "");
return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
}
const model = useProxiedModel(props, "modelValue", null, (val) => val ?? null, (val) => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
const _inputText = shallowRef(null);
const _lastParsedValue = shallowRef(null);
watch(model, (val) => {
if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, ".")) === val) {
} else if (val == null) {
_inputText.value = null;
_lastParsedValue.value = null;
} else if (!isNaN(val)) {
_inputText.value = correctPrecision(val);
_lastParsedValue.value = Number(_inputText.value.replace(decimalSeparator.value, "."));
}
}, {
immediate: true
});
const inputText = computed({
get: () => _inputText.value,
set(val) {
if (val === null || val === "") {
model.value = null;
_inputText.value = null;
_lastParsedValue.value = null;
return;
}
const parsedValue = Number(val.replace(decimalSeparator.value, "."));
if (!isNaN(parsedValue)) {
_inputText.value = val;
_lastParsedValue.value = parsedValue;
if (parsedValue <= props.max && parsedValue >= props.min) {
model.value = parsedValue;
}
}
}
});
const isOutOfRange = computed(() => {
if (_lastParsedValue.value === null) return false;
const numberFromText = Number(_inputText.value?.replace(decimalSeparator.value, "."));
return numberFromText !== clamp(numberFromText, props.min, props.max);
});
const canIncrease = computed(() => {
if (controlsDisabled.value) return false;
return (model.value ?? 0) + props.step <= props.max;
});
const canDecrease = computed(() => {
if (controlsDisabled.value) return false;
return (model.value ?? 0) - props.step >= props.min;
});
const controlVariant = computed(() => {
return props.hideInput ? "stacked" : props.controlVariant;
});
const incrementIcon = toRef(() => controlVariant.value === "split" ? "$plus" : "$collapse");
const decrementIcon = toRef(() => controlVariant.value === "split" ? "$minus" : "$expand");
const controlNodeSize = toRef(() => controlVariant.value === "split" ? "default" : "small");
const controlNodeDefaultHeight = toRef(() => controlVariant.value === "stacked" ? "auto" : "100%");
const incrementSlotProps = {
props: {
onClick: onControlClick,
onPointerup: onControlMouseup,
onPointerdown: onUpControlMousedown,
onPointercancel: onControlMouseup
}
};
const decrementSlotProps = {
props: {
onClick: onControlClick,
onPointerup: onControlMouseup,
onPointerdown: onDownControlMousedown,
onPointercancel: onControlMouseup
}
};
watch(() => props.precision, () => formatInputValue());
watch(() => props.minFractionDigits, () => formatInputValue());
onMounted(() => {
clampModel();
});
function inferPrecision(value) {
if (value == null) return 0;
const str = value.toString();
const idx = str.indexOf(".");
return ~idx ? str.length - idx : 0;
}
function toggleUpDown() {
let increment = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
if (controlsDisabled.value) return;
if (model.value == null) {
inputText.value = correctPrecision(clamp(0, props.min, props.max));
return;
}
let inferredPrecision = Math.max(inferPrecision(model.value), inferPrecision(props.step));
if (props.precision != null) inferredPrecision = Math.max(inferredPrecision, props.precision);
if (increment) {
if (canIncrease.value) inputText.value = correctPrecision(model.value + props.step, inferredPrecision);
} else {
if (canDecrease.value) inputText.value = correctPrecision(model.value - props.step, inferredPrecision);
}
}
function onBeforeinput(e) {
if (!e.data) return;
const inputElement = e.target;
const {
value: existingTxt,
selectionStart,
selectionEnd
} = inputElement ?? {};
const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
e.preventDefault();
inputElement.value = potentialNewNumber;
nextTick(() => inputText.value = potentialNewNumber);
}
if (props.precision == null) return;
if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
e.preventDefault();
inputElement.value = potentialNewNumber;
nextTick(() => inputText.value = potentialNewNumber);
const cursorPosition = (selectionStart ?? 0) + e.data.length;
inputElement.setSelectionRange(cursorPosition, cursorPosition);
}
if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
e.preventDefault();
inputElement.value = potentialNewNumber;
nextTick(() => inputText.value = potentialNewNumber);
}
}
async function onKeydown(e) {
if (["Enter", "ArrowLeft", "ArrowRight", "Backspace", "Delete", "Tab"].includes(e.key) || e.ctrlKey) return;
if (["ArrowDown", "ArrowUp"].includes(e.key)) {
e.preventDefault();
e.stopPropagation();
clampModel();
await nextTick();
if (e.key === "ArrowDown") {
toggleUpDown(false);
} else {
toggleUpDown();
}
}
}
function onControlClick(e) {
e.stopPropagation();
}
function onControlMouseup(e) {
const el = e.currentTarget;
el?.releasePointerCapture(e.pointerId);
e.preventDefault();
holdStop();
}
function onUpControlMousedown(e) {
const el = e.currentTarget;
el?.setPointerCapture(e.pointerId);
e.preventDefault();
e.stopPropagation();
holdStart("up");
}
function onDownControlMousedown(e) {
const el = e.currentTarget;
el?.setPointerCapture(e.pointerId);
e.preventDefault();
e.stopPropagation();
holdStart("down");
}
function clampModel() {
if (controlsDisabled.value) return;
if (!vTextFieldRef.value) return;
const actualText = vTextFieldRef.value.value;
const parsedValue = Number(actualText.replace(decimalSeparator.value, "."));
if (actualText && !isNaN(parsedValue)) {
inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
} else {
inputText.value = null;
}
}
function formatInputValue() {
if (controlsDisabled.value) return;
inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
}
function trimDecimalZeros() {
if (controlsDisabled.value) return;
if (model.value === null || isNaN(model.value)) {
inputText.value = null;
return;
}
inputText.value = model.value.toString().replace(".", decimalSeparator.value);
}
function onFocus() {
trimDecimalZeros();
}
function onBlur() {
clampModel();
}
useRender(() => {
const {
modelValue: _,
type,
...textFieldProps
} = VTextField.filterProps(props);
function incrementControlNode() {
return !slots.increment ? createVNode(VBtn, {
"aria-hidden": "true",
"data-testid": "increment",
"disabled": !canIncrease.value,
"height": controlNodeDefaultHeight.value,
"icon": incrementIcon.value,
"key": "increment-btn",
"onClick": onControlClick,
"onPointerdown": onUpControlMousedown,
"onPointerup": onControlMouseup,
"onPointercancel": onControlMouseup,
"size": controlNodeSize.value,
"variant": "text",
"tabindex": "-1"
}, null) : createVNode(VDefaultsProvider, {
"key": "increment-defaults",
"defaults": {
VBtn: {
disabled: !canIncrease.value,
height: controlNodeDefaultHeight.value,
size: controlNodeSize.value,
icon: incrementIcon.value,
variant: "text"
}
}
}, {
default: () => [slots.increment(incrementSlotProps)]
});
}
function decrementControlNode() {
return !slots.decrement ? createVNode(VBtn, {
"aria-hidden": "true",
"data-testid": "decrement",
"disabled": !canDecrease.value,
"height": controlNodeDefaultHeight.value,
"icon": decrementIcon.value,
"key": "decrement-btn",
"onClick": onControlClick,
"onPointerdown": onDownControlMousedown,
"onPointerup": onControlMouseup,
"onPointercancel": onControlMouseup,
"size": controlNodeSize.value,
"variant": "text",
"tabindex": "-1"
}, null) : createVNode(VDefaultsProvider, {
"key": "decrement-defaults",
"defaults": {
VBtn: {
disabled: !canDecrease.value,
height: controlNodeDefaultHeight.value,
size: controlNodeSize.value,
icon: decrementIcon.value,
variant: "text"
}
}
}, {
default: () => [slots.decrement(decrementSlotProps)]
});
}
function controlNode() {
return createBaseVNode("div", {
"class": "v-number-input__control"
}, [decrementControlNode(), createVNode(VDivider, {
"vertical": controlVariant.value !== "stacked"
}, null), incrementControlNode()]);
}
function dividerNode() {
return !props.hideInput && !props.inset ? createVNode(VDivider, {
"vertical": true
}, null) : void 0;
}
const appendInnerControl = controlVariant.value === "split" ? createBaseVNode("div", {
"class": "v-number-input__control"
}, [createVNode(VDivider, {
"vertical": true
}, null), incrementControlNode()]) : props.reverse || controlVariant.value === "hidden" ? void 0 : createBaseVNode(Fragment, null, [dividerNode(), controlNode()]);
const hasAppendInner = slots["append-inner"] || appendInnerControl;
const prependInnerControl = controlVariant.value === "split" ? createBaseVNode("div", {
"class": "v-number-input__control"
}, [decrementControlNode(), createVNode(VDivider, {
"vertical": true
}, null)]) : props.reverse && controlVariant.value !== "hidden" ? createBaseVNode(Fragment, null, [controlNode(), dividerNode()]) : void 0;
const hasPrependInner = slots["prepend-inner"] || prependInnerControl;
return createVNode(VTextField, mergeProps({
"ref": vTextFieldRef
}, textFieldProps, {
"modelValue": inputText.value,
"onUpdate:modelValue": ($event) => inputText.value = $event,
"focused": isFocused.value,
"onUpdate:focused": ($event) => isFocused.value = $event,
"validationValue": model.value,
"error": props.error || isOutOfRange.value || void 0,
"onBeforeinput": onBeforeinput,
"onFocus": onFocus,
"onBlur": onBlur,
"onKeydown": onKeydown,
"class": ["v-number-input", {
"v-number-input--default": controlVariant.value === "default",
"v-number-input--hide-input": props.hideInput,
"v-number-input--inset": props.inset,
"v-number-input--reverse": props.reverse,
"v-number-input--split": controlVariant.value === "split",
"v-number-input--stacked": controlVariant.value === "stacked"
}, props.class],
"style": props.style,
"inputmode": "decimal"
}), {
...slots,
"append-inner": hasAppendInner ? function() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return createBaseVNode(Fragment, null, [slots["append-inner"]?.(...args), appendInnerControl]);
} : void 0,
"prepend-inner": hasPrependInner ? function() {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return createBaseVNode(Fragment, null, [prependInnerControl, slots["prepend-inner"]?.(...args)]);
} : void 0
});
});
return forwardRefs({}, vTextFieldRef);
}
});
// node_modules/vuetify/lib/components/VOtpInput/VOtpInput.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VOtpInput/VOtpInput.css";
var makeVOtpInputProps = propsFactory({
autofocus: Boolean,
divider: String,
focusAll: Boolean,
label: {
type: String,
default: "$vuetify.input.otp"
},
length: {
type: [Number, String],
default: 6
},
modelValue: {
type: [Number, String],
default: void 0
},
placeholder: String,
type: {
type: String,
default: "number"
},
...makeDimensionProps(),
...makeFocusProps(),
...pick(makeVFieldProps({
variant: "outlined"
}), ["baseColor", "bgColor", "class", "color", "disabled", "error", "loading", "rounded", "style", "theme", "variant"])
}, "VOtpInput");
var VOtpInput = genericComponent()({
name: "VOtpInput",
props: makeVOtpInputProps(),
emits: {
finish: (val) => true,
"update:focused": (val) => true,
"update:modelValue": (val) => true
},
setup(props, _ref) {
let {
attrs,
emit,
slots
} = _ref;
const {
dimensionStyles
} = useDimension(props);
const {
isFocused,
focus,
blur
} = useFocus(props);
const model = useProxiedModel(props, "modelValue", "", (val) => val == null ? [] : String(val).split(""), (val) => val.join(""));
const {
t
} = useLocale();
const length = computed(() => Number(props.length));
const fields = computed(() => Array(length.value).fill(0));
const focusIndex = ref(-1);
const contentRef = ref();
const inputRef = ref([]);
const current = computed(() => inputRef.value[focusIndex.value]);
let _isComposing = false;
useToggleScope(() => props.autofocus, () => {
const intersectScope = effectScope();
intersectScope.run(() => {
const {
intersectionRef,
isIntersecting
} = useIntersectionObserver();
watchEffect(() => {
intersectionRef.value = inputRef.value[0];
});
watch(isIntersecting, (v) => {
if (!v) return;
intersectionRef.value?.focus();
intersectScope.stop();
});
});
});
function onInput() {
if (isValidNumber(current.value.value)) {
current.value.value = "";
return;
}
if (_isComposing) return;
const array = model.value.slice();
const value = current.value.value;
array[focusIndex.value] = value;
let target = null;
if (focusIndex.value > model.value.length) {
target = model.value.length + 1;
} else if (focusIndex.value + 1 !== length.value) {
target = "next";
}
model.value = array;
if (target) focusChild(contentRef.value, target);
}
function onCompositionend() {
_isComposing = false;
onInput();
}
function onKeydown(e) {
const array = model.value.slice();
const index = focusIndex.value;
let target = null;
if (!["ArrowLeft", "ArrowRight", "Backspace", "Delete"].includes(e.key)) return;
e.preventDefault();
if (e.key === "ArrowLeft") {
target = "prev";
} else if (e.key === "ArrowRight") {
target = "next";
} else if (["Backspace", "Delete"].includes(e.key)) {
array[focusIndex.value] = "";
model.value = array;
if (focusIndex.value > 0 && e.key === "Backspace") {
target = "prev";
} else {
requestAnimationFrame(() => {
inputRef.value[index]?.select();
});
}
}
requestAnimationFrame(() => {
if (target != null) {
focusChild(contentRef.value, target);
}
});
}
function onPaste(index, e) {
e.preventDefault();
e.stopPropagation();
const clipboardText = e?.clipboardData?.getData("Text").trim().slice(0, length.value) ?? "";
const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
if (isValidNumber(clipboardText)) return;
model.value = clipboardText.split("");
focusIndex.value = finalIndex;
}
function reset() {
model.value = [];
}
function onFocus(e, index) {
focus();
focusIndex.value = index;
}
function onBlur() {
blur();
focusIndex.value = -1;
}
function isValidNumber(value) {
return props.type === "number" && /[^0-9]/g.test(value);
}
provideDefaults({
VField: {
color: toRef(() => props.color),
bgColor: toRef(() => props.color),
baseColor: toRef(() => props.baseColor),
disabled: toRef(() => props.disabled),
error: toRef(() => props.error),
variant: toRef(() => props.variant),
rounded: toRef(() => props.rounded)
}
}, {
scoped: true
});
watch(model, (val) => {
if (val.length === length.value) {
emit("finish", val.join(""));
}
}, {
deep: true
});
watch(focusIndex, (val) => {
if (val < 0) return;
nextTick(() => {
inputRef.value[val]?.select();
});
});
useRender(() => {
const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
return createBaseVNode("div", mergeProps({
"class": ["v-otp-input", {
"v-otp-input--divided": !!props.divider
}, props.class],
"style": [props.style]
}, rootAttrs), [createBaseVNode("div", {
"ref": contentRef,
"class": "v-otp-input__content",
"style": normalizeStyle([dimensionStyles.value])
}, [fields.value.map((_, i) => createBaseVNode(Fragment, null, [props.divider && i !== 0 && createBaseVNode("span", {
"class": "v-otp-input__divider"
}, [props.divider]), createVNode(VField, {
"focused": isFocused.value && props.focusAll || focusIndex.value === i,
"key": i
}, {
...slots,
loader: void 0,
default: () => {
return createBaseVNode("input", {
"ref": (val) => inputRef.value[i] = val,
"aria-label": t(props.label, i + 1),
"autofocus": i === 0 && props.autofocus,
"autocomplete": "one-time-code",
"class": normalizeClass(["v-otp-input__field"]),
"disabled": props.disabled,
"inputmode": props.type === "number" ? "numeric" : "text",
"min": props.type === "number" ? 0 : void 0,
"maxlength": i === 0 ? length.value : "1",
"placeholder": props.placeholder,
"type": props.type === "number" ? "text" : props.type,
"value": model.value[i],
"onInput": onInput,
"onFocus": (e) => onFocus(e, i),
"onBlur": onBlur,
"onKeydown": onKeydown,
"onCompositionstart": () => _isComposing = true,
"onCompositionend": onCompositionend,
"onPaste": (event) => onPaste(i, event)
}, null);
}
})])), createBaseVNode("input", mergeProps({
"class": "v-otp-input-input",
"type": "hidden"
}, inputAttrs, {
"value": model.value.join("")
}), null), createVNode(VOverlay, {
"contained": true,
"contentClass": "v-otp-input__loader",
"modelValue": !!props.loading,
"persistent": true
}, {
default: () => [slots.loader?.() ?? createVNode(VProgressCircular, {
"color": typeof props.loading === "boolean" ? void 0 : props.loading,
"indeterminate": true,
"size": "24",
"width": "2"
}, null)]
}), slots.default?.()])]);
});
return {
blur: () => {
inputRef.value?.some((input) => input.blur());
},
focus: () => {
inputRef.value?.[0].focus();
},
reset,
isFocused
};
}
});
// node_modules/vuetify/lib/components/VParallax/VParallax.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VParallax/VParallax.css";
function floor(val) {
return Math.floor(Math.abs(val)) * Math.sign(val);
}
var makeVParallaxProps = propsFactory({
scale: {
type: [Number, String],
default: 0.5
},
...makeComponentProps()
}, "VParallax");
var VParallax = genericComponent()({
name: "VParallax",
props: makeVParallaxProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
intersectionRef,
isIntersecting
} = useIntersectionObserver();
const {
resizeRef,
contentRect
} = useResizeObserver();
const {
height: displayHeight
} = useDisplay();
const root = ref();
watchEffect(() => {
intersectionRef.value = resizeRef.value = root.value?.$el;
});
let scrollParent;
watch(isIntersecting, (val) => {
if (val) {
scrollParent = getScrollParent(intersectionRef.value);
scrollParent = scrollParent === document.scrollingElement ? document : scrollParent;
scrollParent.addEventListener("scroll", onScroll, {
passive: true
});
onScroll();
} else {
scrollParent.removeEventListener("scroll", onScroll);
}
});
onBeforeUnmount(() => {
scrollParent?.removeEventListener("scroll", onScroll);
});
watch(displayHeight, onScroll);
watch(() => contentRect.value?.height, onScroll);
const scale = computed(() => {
return 1 - clamp(Number(props.scale));
});
let frame = -1;
function onScroll() {
if (!isIntersecting.value || PREFERS_REDUCED_MOTION()) return;
cancelAnimationFrame(frame);
frame = requestAnimationFrame(() => {
const el = (root.value?.$el).querySelector(".v-img__img");
if (!el) return;
const scrollHeight = scrollParent instanceof Document ? document.documentElement.clientHeight : scrollParent.clientHeight;
const scrollPos = scrollParent instanceof Document ? window.scrollY : scrollParent.scrollTop;
const top = intersectionRef.value.getBoundingClientRect().top + scrollPos;
const height = contentRect.value.height;
const center = top + (height - scrollHeight) / 2;
const translate = floor((scrollPos - center) * scale.value);
const sizeScale = Math.max(1, (scale.value * (scrollHeight - height) + height) / height);
el.style.setProperty("transform", `translateY(${translate}px) scale(${sizeScale})`);
});
}
useRender(() => createVNode(VImg, {
"class": normalizeClass(["v-parallax", {
"v-parallax--active": isIntersecting.value
}, props.class]),
"style": normalizeStyle(props.style),
"ref": root,
"cover": true,
"onLoadstart": onScroll,
"onLoad": onScroll
}, slots));
return {};
}
});
// node_modules/vuetify/lib/components/VRadio/VRadio.js
var makeVRadioProps = propsFactory({
...makeVSelectionControlProps({
falseIcon: "$radioOff",
trueIcon: "$radioOn"
})
}, "VRadio");
var VRadio = genericComponent()({
name: "VRadio",
props: makeVRadioProps(),
setup(props, _ref) {
let {
slots
} = _ref;
useRender(() => {
const controlProps = VSelectionControl.filterProps(props);
return createVNode(VSelectionControl, mergeProps(controlProps, {
"class": ["v-radio", props.class],
"style": props.style,
"type": "radio"
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VRadioGroup/VRadioGroup.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VRadioGroup/VRadioGroup.css";
var makeVRadioGroupProps = propsFactory({
height: {
type: [Number, String],
default: "auto"
},
...makeVInputProps(),
...omit(makeSelectionControlGroupProps(), ["multiple"]),
trueIcon: {
type: IconValue,
default: "$radioOn"
},
falseIcon: {
type: IconValue,
default: "$radioOff"
},
type: {
type: String,
default: "radio"
}
}, "VRadioGroup");
var VRadioGroup = genericComponent()({
name: "VRadioGroup",
inheritAttrs: false,
props: makeVRadioGroupProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
attrs,
slots
} = _ref;
const uid = useId();
const id = computed(() => props.id || `radio-group-${uid}`);
const model = useProxiedModel(props, "modelValue");
const inputRef = ref();
useRender(() => {
const [rootAttrs, controlAttrs] = filterInputAttrs(attrs);
const inputProps = VInput.filterProps(props);
const controlProps = VSelectionControl.filterProps(props);
const label = slots.label ? slots.label({
label: props.label,
props: {
for: id.value
}
}) : props.label;
return createVNode(VInput, mergeProps({
"ref": inputRef,
"class": ["v-radio-group", props.class],
"style": props.style
}, rootAttrs, inputProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"id": id.value
}), {
...slots,
default: (_ref2) => {
let {
id: id2,
messagesId,
isDisabled,
isReadonly
} = _ref2;
return createBaseVNode(Fragment, null, [label && createVNode(VLabel, {
"id": id2.value
}, {
default: () => [label]
}), createVNode(VSelectionControlGroup, mergeProps(controlProps, {
"id": id2.value,
"aria-describedby": messagesId.value,
"defaultsTarget": "VRadio",
"trueIcon": props.trueIcon,
"falseIcon": props.falseIcon,
"type": props.type,
"disabled": isDisabled.value,
"readonly": isReadonly.value,
"aria-labelledby": label ? id2.value : void 0,
"multiple": false
}, controlAttrs, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event
}), slots)]);
}
});
});
return forwardRefs({}, inputRef);
}
});
// node_modules/vuetify/lib/components/VRangeSlider/VRangeSlider.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSlider/VSlider.css";
var makeVRangeSliderProps = propsFactory({
...makeFocusProps(),
...makeVInputProps(),
...makeSliderProps(),
strict: Boolean,
modelValue: {
type: Array,
default: () => [0, 0]
}
}, "VRangeSlider");
var VRangeSlider = genericComponent()({
name: "VRangeSlider",
inheritAttrs: false,
props: makeVRangeSliderProps(),
emits: {
"update:focused": (value) => true,
"update:modelValue": (value) => true,
end: (value) => true,
start: (value) => true
},
setup(props, _ref) {
let {
slots,
emit,
attrs
} = _ref;
const startThumbRef = ref();
const stopThumbRef = ref();
const inputRef = ref();
const {
rtlClasses
} = useRtl();
function getActiveThumb(e) {
if (!startThumbRef.value || !stopThumbRef.value) return;
const startOffset = getOffset(e, startThumbRef.value.$el, props.direction);
const stopOffset = getOffset(e, stopThumbRef.value.$el, props.direction);
const a = Math.abs(startOffset);
const b = Math.abs(stopOffset);
return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el;
}
const steps = useSteps(props);
const model = useProxiedModel(props, "modelValue", void 0, (arr) => {
if (!arr?.length) return [0, 0];
return arr.map((value) => steps.roundValue(value));
});
const {
activeThumbRef,
hasLabels,
max,
min,
mousePressed,
onSliderMousedown,
onSliderTouchstart,
position,
trackContainerRef,
disabled,
readonly
} = useSlider({
props,
steps,
onSliderStart: () => {
if (disabled.value || readonly.value) {
activeThumbRef.value?.blur();
return;
}
emit("start", model.value);
},
onSliderEnd: (_ref2) => {
let {
value
} = _ref2;
if (disabled.value || readonly.value) {
activeThumbRef.value?.blur();
} else {
const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];
if (!props.strict && newValue[0] < newValue[1]) {
model.value = newValue;
}
}
emit("end", model.value);
},
onSliderMove: (_ref3) => {
let {
value
} = _ref3;
const [start, stop] = model.value;
if (disabled.value || readonly.value) {
activeThumbRef.value?.blur();
return;
}
if (!props.strict && start === stop && start !== min.value) {
activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
activeThumbRef.value?.focus();
}
if (activeThumbRef.value === startThumbRef.value?.$el) {
model.value = [Math.min(value, stop), stop];
} else {
model.value = [start, Math.max(start, value)];
}
},
getActiveThumb
});
const {
isFocused,
focus,
blur
} = useFocus(props);
const trackStart = computed(() => position(model.value[0]));
const trackStop = computed(() => position(model.value[1]));
useRender(() => {
const inputProps = VInput.filterProps(props);
const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
const hasPrepend = !!(props.label || slots.label || slots.prepend);
return createVNode(VInput, mergeProps({
"class": ["v-slider", "v-range-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,
"ref": inputRef
}, inputProps, rootAttrs, {
"focused": isFocused.value
}), {
...slots,
prepend: hasPrepend ? (slotProps) => createBaseVNode(Fragment, null, [slots.label?.(slotProps) ?? (props.label ? createVNode(VLabel, {
"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}_start`,
"name": props.name || id.value,
"disabled": disabled.value,
"readonly": readonly.value,
"tabindex": "-1",
"value": model.value[0]
}, null), createBaseVNode("input", {
"id": `${id.value}_stop`,
"name": props.name || id.value,
"disabled": disabled.value,
"readonly": readonly.value,
"tabindex": "-1",
"value": model.value[1]
}, null), createVNode(VSliderTrack, {
"ref": trackContainerRef,
"start": trackStart.value,
"stop": trackStop.value
}, {
"tick-label": slots["tick-label"]
}), createVNode(VSliderThumb, mergeProps({
"ref": startThumbRef,
"aria-describedby": messagesId.value,
"focused": isFocused && activeThumbRef.value === startThumbRef.value?.$el,
"modelValue": model.value[0],
"onUpdate:modelValue": (v) => model.value = [v, model.value[1]],
"onFocus": (e) => {
focus();
activeThumbRef.value = startThumbRef.value?.$el;
if (max.value !== min.value && model.value[0] === model.value[1] && model.value[1] === min.value && e.relatedTarget !== stopThumbRef.value?.$el) {
startThumbRef.value?.$el.blur();
stopThumbRef.value?.$el.focus();
}
},
"onBlur": () => {
blur();
activeThumbRef.value = void 0;
},
"min": min.value,
"max": model.value[1],
"position": trackStart.value,
"ripple": props.ripple
}, inputAttrs), {
"thumb-label": slots["thumb-label"]
}), createVNode(VSliderThumb, mergeProps({
"ref": stopThumbRef,
"aria-describedby": messagesId.value,
"focused": isFocused && activeThumbRef.value === stopThumbRef.value?.$el,
"modelValue": model.value[1],
"onUpdate:modelValue": (v) => model.value = [model.value[0], v],
"onFocus": (e) => {
focus();
activeThumbRef.value = stopThumbRef.value?.$el;
if (max.value !== min.value && model.value[0] === model.value[1] && model.value[0] === max.value && e.relatedTarget !== startThumbRef.value?.$el) {
stopThumbRef.value?.$el.blur();
startThumbRef.value?.$el.focus();
}
},
"onBlur": () => {
blur();
activeThumbRef.value = void 0;
},
"min": model.value[0],
"max": max.value,
"position": trackStop.value,
"ripple": props.ripple
}, inputAttrs), {
"thumb-label": slots["thumb-label"]
})]);
}
});
});
return forwardRefs({
focus: () => startThumbRef.value?.$el.focus()
}, inputRef);
}
});
// node_modules/vuetify/lib/components/VRating/VRating.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VRating/VRating.css";
var makeVRatingProps = propsFactory({
name: String,
itemAriaLabel: {
type: String,
default: "$vuetify.rating.ariaLabel.item"
},
activeColor: String,
color: String,
clearable: Boolean,
disabled: Boolean,
emptyIcon: {
type: IconValue,
default: "$ratingEmpty"
},
fullIcon: {
type: IconValue,
default: "$ratingFull"
},
halfIncrements: Boolean,
hover: Boolean,
length: {
type: [Number, String],
default: 5
},
readonly: Boolean,
modelValue: {
type: [Number, String],
default: 0
},
itemLabels: Array,
itemLabelPosition: {
type: String,
default: "top",
validator: (v) => ["top", "bottom"].includes(v)
},
ripple: Boolean,
...makeComponentProps(),
...makeDensityProps(),
...makeSizeProps(),
...makeTagProps(),
...makeThemeProps()
}, "VRating");
var VRating = genericComponent()({
name: "VRating",
props: makeVRatingProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
t
} = useLocale();
const {
themeClasses
} = provideTheme(props);
const root = ref();
const rating = useProxiedModel(props, "modelValue");
const normalizedValue = computed(() => clamp(parseFloat(rating.value), 0, Number(props.length)));
const range = computed(() => createRange(Number(props.length), 1));
const increments = computed(() => range.value.flatMap((v) => props.halfIncrements ? [v - 0.5, v] : [v]));
const hoverIndex = shallowRef(-1);
const itemState = computed(() => increments.value.map((value) => {
const isHovering = props.hover && hoverIndex.value > -1;
const isFilled = normalizedValue.value >= value;
const isHovered = hoverIndex.value >= value;
const isFullIcon = isHovering ? isHovered : isFilled;
const icon = isFullIcon ? props.fullIcon : props.emptyIcon;
const activeColor = props.activeColor ?? props.color;
const color = isFilled || isHovered ? activeColor : props.color;
return {
isFilled,
isHovered,
icon,
color
};
}));
const eventState = computed(() => [0, ...increments.value].map((value) => {
function onMouseenter() {
hoverIndex.value = value;
}
function onMouseleave() {
hoverIndex.value = -1;
}
function onClick() {
if (props.disabled || props.readonly) return;
rating.value = normalizedValue.value === value && props.clearable ? 0 : value;
}
return {
onMouseenter: props.hover ? onMouseenter : void 0,
onMouseleave: props.hover ? onMouseleave : void 0,
onClick
};
}));
const currentItemIndex = computed(() => {
return props.halfIncrements ? 1 + Math.floor(Math.max(0, Number(rating.value ?? 0) - 0.5)) * 2 : Math.floor(Math.max(0, Number(rating.value ?? 0) - 1));
});
function moveCurrentFocus() {
const currentItem = root.value?.querySelector('[tabindex="0"]');
currentItem?.focus();
}
function onItemKeydown(event) {
if (props.disabled || props.readonly) return;
if (event.ctrlKey || event.altKey) return;
const step = props.halfIncrements ? 0.5 : 1;
if (event.key === "ArrowRight") {
const newValue = Math.min(Number(props.length), Number(rating.value ?? 0) + step);
rating.value = newValue;
nextTick(() => moveCurrentFocus());
}
if (event.key === "ArrowLeft") {
const newValue = Math.max(0, Number(rating.value ?? 0) - step);
rating.value = newValue;
nextTick(() => moveCurrentFocus());
}
}
const uid = useId();
const name = computed(() => props.name ?? `v-rating-${uid}`);
function VRatingItem(_ref2) {
let {
value,
index,
showStar = true
} = _ref2;
const {
onMouseenter,
onMouseleave,
onClick
} = eventState.value[index + 1];
const id = `${name.value}-${String(value).replace(".", "-")}`;
const isFocusable = index === currentItemIndex.value;
const btnProps = {
color: itemState.value[index]?.color,
density: props.density,
disabled: props.disabled,
icon: itemState.value[index]?.icon,
ripple: props.ripple,
size: props.size,
variant: "plain",
tabindex: isFocusable ? 0 : -1,
onKeydown: onItemKeydown
};
return createBaseVNode(Fragment, null, [createBaseVNode("label", {
"for": id,
"class": normalizeClass({
"v-rating__item--half": props.halfIncrements && value % 1 > 0,
"v-rating__item--full": props.halfIncrements && value % 1 === 0
}),
"onMouseenter": onMouseenter,
"onMouseleave": onMouseleave,
"onClick": onClick
}, [createBaseVNode("span", {
"class": "v-rating__hidden"
}, [t(props.itemAriaLabel, value, props.length)]), !showStar ? void 0 : slots.item ? slots.item({
...itemState.value[index],
props: btnProps,
value,
index,
rating: normalizedValue.value
}) : createVNode(VBtn, mergeProps({
"aria-label": t(props.itemAriaLabel, value, props.length)
}, btnProps), null)]), createBaseVNode("input", {
"class": "v-rating__hidden",
"name": name.value,
"id": id,
"type": "radio",
"value": value,
"checked": normalizedValue.value === value,
"tabindex": -1,
"readonly": props.readonly,
"disabled": props.disabled
}, null)]);
}
function createLabel(labelProps) {
if (slots["item-label"]) return slots["item-label"](labelProps);
if (labelProps.label) return createBaseVNode("span", null, [labelProps.label]);
return createBaseVNode("span", null, [createTextVNode(" ")]);
}
useRender(() => {
const hasLabels = !!props.itemLabels?.length || slots["item-label"];
return createVNode(props.tag, {
"class": normalizeClass(["v-rating", {
"v-rating--hover": props.hover,
"v-rating--readonly": props.readonly
}, themeClasses.value, props.class]),
"style": normalizeStyle(props.style),
"ref": root
}, {
default: () => [createVNode(VRatingItem, {
"value": 0,
"index": -1,
"showStar": false
}, null), range.value.map((value, i) => createBaseVNode("div", {
"class": "v-rating__wrapper"
}, [hasLabels && props.itemLabelPosition === "top" ? createLabel({
value,
index: i,
label: props.itemLabels?.[i]
}) : void 0, createBaseVNode("div", {
"class": "v-rating__item"
}, [props.halfIncrements ? createBaseVNode(Fragment, null, [createVNode(VRatingItem, {
"value": value - 0.5,
"index": i * 2
}, null), createVNode(VRatingItem, {
"value": value,
"index": i * 2 + 1
}, null)]) : createVNode(VRatingItem, {
"value": value,
"index": i
}, null)]), hasLabels && props.itemLabelPosition === "bottom" ? createLabel({
value,
index: i,
label: props.itemLabels?.[i]
}) : void 0]))]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VSkeletonLoader/VSkeletonLoader.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSkeletonLoader/VSkeletonLoader.css";
var rootTypes = {
actions: "button@2",
article: "heading, paragraph",
avatar: "avatar",
button: "button",
card: "image, heading",
"card-avatar": "image, list-item-avatar",
chip: "chip",
"date-picker": "list-item, heading, divider, date-picker-options, date-picker-days, actions",
"date-picker-options": "text, avatar@2",
"date-picker-days": "avatar@28",
divider: "divider",
heading: "heading",
image: "image",
"list-item": "text",
"list-item-avatar": "avatar, text",
"list-item-two-line": "sentences",
"list-item-avatar-two-line": "avatar, sentences",
"list-item-three-line": "paragraph",
"list-item-avatar-three-line": "avatar, paragraph",
ossein: "ossein",
paragraph: "text@3",
sentences: "text@2",
subtitle: "text",
table: "table-heading, table-thead, table-tbody, table-tfoot",
"table-heading": "chip, text",
"table-thead": "heading@6",
"table-tbody": "table-row-divider@6",
"table-row-divider": "table-row, divider",
"table-row": "text@6",
"table-tfoot": "text@2, avatar@2",
text: "text"
};
function genBone(type) {
let children = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
return createBaseVNode("div", {
"class": normalizeClass(["v-skeleton-loader__bone", `v-skeleton-loader__${type}`])
}, [children]);
}
function genBones(bone) {
const [type, length] = bone.split("@");
return Array.from({
length
}).map(() => genStructure(type));
}
function genStructure(type) {
let children = [];
if (!type) return children;
const bone = rootTypes[type];
if (type === bone) {
} else if (type.includes(",")) return mapBones(type);
else if (type.includes("@")) return genBones(type);
else if (bone.includes(",")) children = mapBones(bone);
else if (bone.includes("@")) children = genBones(bone);
else if (bone) children.push(genStructure(bone));
return [genBone(type, children)];
}
function mapBones(bones) {
return bones.replace(/\s/g, "").split(",").map(genStructure);
}
var makeVSkeletonLoaderProps = propsFactory({
boilerplate: Boolean,
color: String,
loading: Boolean,
loadingText: {
type: String,
default: "$vuetify.loading"
},
type: {
type: [String, Array],
default: "ossein"
},
...makeDimensionProps(),
...makeElevationProps(),
...makeThemeProps()
}, "VSkeletonLoader");
var VSkeletonLoader = genericComponent()({
name: "VSkeletonLoader",
inheritAttrs: false,
props: makeVSkeletonLoaderProps(),
setup(props, _ref) {
let {
attrs,
slots
} = _ref;
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const {
dimensionStyles
} = useDimension(props);
const {
elevationClasses
} = useElevation(props);
const {
themeClasses
} = provideTheme(props);
const {
t
} = useLocale();
const items = computed(() => genStructure(wrapInArray(props.type).join(",")));
useRender(() => {
const isLoading = !slots.default || props.loading;
const loadingProps = props.boilerplate || !isLoading ? {} : {
ariaLive: "polite",
ariaLabel: t(props.loadingText),
role: "alert"
};
return isLoading ? createBaseVNode("div", mergeProps({
"class": ["v-skeleton-loader", {
"v-skeleton-loader--boilerplate": props.boilerplate
}, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
"style": [backgroundColorStyles.value, dimensionStyles.value]
}, loadingProps, attrs), [items.value]) : createBaseVNode(Fragment, null, [slots.default?.()]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VSlideGroup/VSlideGroupItem.js
var VSlideGroupItem = genericComponent()({
name: "VSlideGroupItem",
props: makeGroupItemProps(),
emits: {
"group:selected": (val) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const slideGroupItem = useGroupItem(props, VSlideGroupSymbol);
return () => slots.default?.({
isSelected: slideGroupItem.isSelected.value,
select: slideGroupItem.select,
toggle: slideGroupItem.toggle,
selectedClass: slideGroupItem.selectedClass.value
});
}
});
// node_modules/vuetify/lib/components/VSnackbarQueue/VSnackbarQueue.js
var makeVSnackbarQueueProps = propsFactory({
// TODO: Port this to Snackbar on dev
closable: [Boolean, String],
closeText: {
type: String,
default: "$vuetify.dismiss"
},
modelValue: {
type: Array,
default: () => []
},
...omit(makeVSnackbarProps(), ["modelValue"])
}, "VSnackbarQueue");
var VSnackbarQueue = genericComponent()({
name: "VSnackbarQueue",
props: makeVSnackbarQueueProps(),
emits: {
"update:modelValue": (val) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
t
} = useLocale();
const isActive = shallowRef(false);
const isVisible = shallowRef(false);
const current = shallowRef();
watch(() => props.modelValue.length, (val, oldVal) => {
if (!isVisible.value && val > oldVal) {
showNext();
}
});
watch(isActive, (val) => {
if (val) isVisible.value = true;
});
function onAfterLeave() {
if (props.modelValue.length) {
showNext();
} else {
current.value = void 0;
isVisible.value = false;
}
}
function showNext() {
const [next, ...rest] = props.modelValue;
emit("update:modelValue", rest);
current.value = typeof next === "string" ? {
text: next
} : next;
nextTick(() => {
isActive.value = true;
});
}
function onClickClose() {
isActive.value = false;
}
const btnProps = computed(() => ({
color: typeof props.closable === "string" ? props.closable : void 0,
text: t(props.closeText)
}));
useRender(() => {
const hasActions = !!(props.closable || slots.actions);
const {
modelValue: _,
...snackbarProps
} = VSnackbar.filterProps(props);
return createBaseVNode(Fragment, null, [isVisible.value && !!current.value && (slots.default ? createVNode(VDefaultsProvider, {
"defaults": {
VSnackbar: current.value
}
}, {
default: () => [slots.default({
item: current.value
})]
}) : createVNode(VSnackbar, mergeProps(snackbarProps, current.value, {
"modelValue": isActive.value,
"onUpdate:modelValue": ($event) => isActive.value = $event,
"onAfterLeave": onAfterLeave
}), {
text: slots.text ? () => slots.text?.({
item: current.value
}) : void 0,
actions: hasActions ? () => createBaseVNode(Fragment, null, [!slots.actions ? createVNode(VBtn, mergeProps(btnProps.value, {
"onClick": onClickClose
}), null) : createVNode(VDefaultsProvider, {
"defaults": {
VBtn: btnProps.value
}
}, {
default: () => [slots.actions({
item: current.value,
props: {
onClick: onClickClose
}
})]
})]) : void 0
}))]);
});
}
});
// node_modules/vuetify/lib/components/VSparkline/util/line.js
var makeLineProps = propsFactory({
autoDraw: Boolean,
autoDrawDuration: [Number, String],
autoDrawEasing: {
type: String,
default: "ease"
},
color: String,
gradient: {
type: Array,
default: () => []
},
gradientDirection: {
type: String,
validator: (val) => ["top", "bottom", "left", "right"].includes(val),
default: "top"
},
height: {
type: [String, Number],
default: 75
},
labels: {
type: Array,
default: () => []
},
labelSize: {
type: [Number, String],
default: 7
},
lineWidth: {
type: [String, Number],
default: 4
},
id: String,
itemValue: {
type: String,
default: "value"
},
modelValue: {
type: Array,
default: () => []
},
min: [String, Number],
max: [String, Number],
padding: {
type: [String, Number],
default: 8
},
showLabels: Boolean,
smooth: [Boolean, String, Number],
width: {
type: [Number, String],
default: 300
}
}, "Line");
// node_modules/vuetify/lib/components/VSparkline/VBarline.js
var makeVBarlineProps = propsFactory({
autoLineWidth: Boolean,
...makeLineProps()
}, "VBarline");
var VBarline = genericComponent()({
name: "VBarline",
props: makeVBarlineProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const uid = useId();
const id = computed(() => props.id || `barline-${uid}`);
const autoDrawDuration = computed(() => Number(props.autoDrawDuration) || 500);
const hasLabels = computed(() => {
return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
});
const lineWidth = computed(() => parseFloat(props.lineWidth) || 4);
const totalWidth = computed(() => Math.max(props.modelValue.length * lineWidth.value, Number(props.width)));
const boundary = computed(() => {
return {
minX: 0,
maxX: totalWidth.value,
minY: 0,
maxY: parseInt(props.height, 10)
};
});
const items = computed(() => props.modelValue.map((item) => getPropertyFromItem(item, props.itemValue, item)));
function genBars(values, boundary2) {
const {
minX,
maxX,
minY,
maxY
} = boundary2;
const totalValues = values.length;
let maxValue = props.max != null ? Number(props.max) : Math.max(...values);
let minValue = props.min != null ? Number(props.min) : Math.min(...values);
if (minValue > 0 && props.min == null) minValue = 0;
if (maxValue < 0 && props.max == null) maxValue = 0;
const gridX = maxX / (totalValues === 1 ? 2 : totalValues);
const gridY = (maxY - minY) / (maxValue - minValue || 1);
const horizonY = maxY - Math.abs(minValue * gridY);
return values.map((value, index) => {
const height = Math.abs(gridY * value);
return {
x: minX + index * gridX,
y: horizonY - height + Number(value < 0) * height,
height,
value
};
});
}
const parsedLabels = computed(() => {
const labels = [];
const points = genBars(items.value, boundary.value);
const len = points.length;
for (let i = 0; labels.length < len; i++) {
const item = points[i];
let value = props.labels[i];
if (!value) {
value = typeof item === "object" ? item.value : item;
}
labels.push({
x: item.x,
value: String(value)
});
}
return labels;
});
const bars = computed(() => genBars(items.value, boundary.value));
const offsetX = computed(() => bars.value.length === 1 ? (boundary.value.maxX - lineWidth.value) / 2 : (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2);
const smooth = computed(() => typeof props.smooth === "boolean" ? props.smooth ? 2 : 0 : Number(props.smooth));
useRender(() => {
const gradientData = !props.gradient.slice().length ? [""] : props.gradient.slice().reverse();
return createBaseVNode("svg", {
"display": "block"
}, [createBaseVNode("defs", null, [createBaseVNode("linearGradient", {
"id": id.value,
"gradientUnits": "userSpaceOnUse",
"x1": props.gradientDirection === "left" ? "100%" : "0",
"y1": props.gradientDirection === "top" ? "100%" : "0",
"x2": props.gradientDirection === "right" ? "100%" : "0",
"y2": props.gradientDirection === "bottom" ? "100%" : "0"
}, [gradientData.map((color, index) => createBaseVNode("stop", {
"offset": index / Math.max(gradientData.length - 1, 1),
"stop-color": color || "currentColor"
}, null))])]), createBaseVNode("clipPath", {
"id": `${id.value}-clip`
}, [bars.value.map((item) => createBaseVNode("rect", {
"x": item.x + offsetX.value,
"y": item.y,
"width": lineWidth.value,
"height": item.height,
"rx": smooth.value,
"ry": smooth.value
}, [props.autoDraw && !PREFERS_REDUCED_MOTION() && createBaseVNode(Fragment, null, [createBaseVNode("animate", {
"attributeName": "y",
"from": item.y + item.height,
"to": item.y,
"dur": `${autoDrawDuration.value}ms`,
"fill": "freeze"
}, null), createBaseVNode("animate", {
"attributeName": "height",
"from": "0",
"to": item.height,
"dur": `${autoDrawDuration.value}ms`,
"fill": "freeze"
}, null)])]))]), hasLabels.value && createBaseVNode("g", {
"key": "labels",
"style": {
textAnchor: "middle",
dominantBaseline: "mathematical",
fill: "currentColor"
}
}, [parsedLabels.value.map((item, i) => createBaseVNode("text", {
"x": item.x + offsetX.value + lineWidth.value / 2,
"y": parseInt(props.height, 10) - 2 + (parseInt(props.labelSize, 10) || 7 * 0.75),
"font-size": Number(props.labelSize) || 7
}, [slots.label?.({
index: i,
value: item.value
}) ?? item.value]))]), createBaseVNode("g", {
"clip-path": `url(#${id.value}-clip)`,
"fill": `url(#${id.value})`
}, [createBaseVNode("rect", {
"x": 0,
"y": 0,
"width": Math.max(props.modelValue.length * lineWidth.value, Number(props.width)),
"height": props.height
}, null)])]);
});
}
});
// node_modules/vuetify/lib/components/VSparkline/util/path.js
function genPath(points, radius) {
let fill = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
let height = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 75;
if (points.length === 0) return "";
const start = points.shift();
const end = points[points.length - 1];
return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => {
const next = points[index + 1];
const prev = points[index - 1] || start;
const isCollinear = next && checkCollinear(next, point, prev);
if (!next || isCollinear) {
return `L${point.x} ${point.y}`;
}
const threshold = Math.min(getDistance(prev, point), getDistance(next, point));
const isTooCloseForRadius = threshold / 2 < radius;
const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
const before = moveTo(prev, point, radiusForPoint);
const after = moveTo(next, point, radiusForPoint);
return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`;
}).join("") + (fill ? `L${end.x} ${height - start.x + 2} Z` : "");
}
function int(value) {
return parseInt(value, 10);
}
function checkCollinear(p0, p1, p2) {
return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y);
}
function getDistance(p1, p2) {
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
}
function moveTo(to, from, radius) {
const vector = {
x: to.x - from.x,
y: to.y - from.y
};
const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
const unitVector = {
x: vector.x / length,
y: vector.y / length
};
return {
x: from.x + unitVector.x * radius,
y: from.y + unitVector.y * radius
};
}
// node_modules/vuetify/lib/components/VSparkline/VTrendline.js
var makeVTrendlineProps = propsFactory({
fill: Boolean,
...makeLineProps()
}, "VTrendline");
var VTrendline = genericComponent()({
name: "VTrendline",
props: makeVTrendlineProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const uid = useId();
const id = computed(() => props.id || `trendline-${uid}`);
const autoDrawDuration = computed(() => Number(props.autoDrawDuration) || (props.fill ? 500 : 2e3));
const lastLength = ref(0);
const path = ref(null);
function genPoints(values, boundary2) {
const {
minX,
maxX,
minY,
maxY
} = boundary2;
if (values.length === 1) {
values = [values[0], values[0]];
}
const totalValues = values.length;
const maxValue = props.max != null ? Number(props.max) : Math.max(...values);
const minValue = props.min != null ? Number(props.min) : Math.min(...values);
const gridX = (maxX - minX) / (totalValues - 1);
const gridY = (maxY - minY) / (maxValue - minValue || 1);
return values.map((value, index) => {
return {
x: minX + index * gridX,
y: maxY - (value - minValue) * gridY,
value
};
});
}
const hasLabels = computed(() => {
return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
});
const lineWidth = computed(() => {
return parseFloat(props.lineWidth) || 4;
});
const totalWidth = computed(() => Number(props.width));
const boundary = computed(() => {
const padding = Number(props.padding);
return {
minX: padding,
maxX: totalWidth.value - padding,
minY: padding,
maxY: parseInt(props.height, 10) - padding
};
});
const items = computed(() => props.modelValue.map((item) => getPropertyFromItem(item, props.itemValue, item)));
const parsedLabels = computed(() => {
const labels = [];
const points = genPoints(items.value, boundary.value);
const len = points.length;
for (let i = 0; labels.length < len; i++) {
const item = points[i];
let value = props.labels[i];
if (!value) {
value = typeof item === "object" ? item.value : item;
}
labels.push({
x: item.x,
value: String(value)
});
}
return labels;
});
watch(() => props.modelValue, async () => {
await nextTick();
if (!props.autoDraw || !path.value || PREFERS_REDUCED_MOTION()) return;
const pathRef = path.value;
const length = pathRef.getTotalLength();
if (!props.fill) {
pathRef.style.strokeDasharray = `${length}`;
pathRef.style.strokeDashoffset = `${length}`;
pathRef.getBoundingClientRect();
pathRef.style.transition = `stroke-dashoffset ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
pathRef.style.strokeDashoffset = "0";
} else {
pathRef.style.transformOrigin = "bottom center";
pathRef.style.transition = "none";
pathRef.style.transform = `scaleY(0)`;
pathRef.getBoundingClientRect();
pathRef.style.transition = `transform ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
pathRef.style.transform = `scaleY(1)`;
}
lastLength.value = length;
}, {
immediate: true
});
function genPath2(fill) {
const smoothValue = typeof props.smooth === "boolean" ? props.smooth ? 8 : 0 : Number(props.smooth);
return genPath(genPoints(items.value, boundary.value), smoothValue, fill, parseInt(props.height, 10));
}
useRender(() => {
const gradientData = !props.gradient.slice().length ? [""] : props.gradient.slice().reverse();
return createBaseVNode("svg", {
"display": "block",
"stroke-width": parseFloat(props.lineWidth) ?? 4
}, [createBaseVNode("defs", null, [createBaseVNode("linearGradient", {
"id": id.value,
"gradientUnits": "userSpaceOnUse",
"x1": props.gradientDirection === "left" ? "100%" : "0",
"y1": props.gradientDirection === "top" ? "100%" : "0",
"x2": props.gradientDirection === "right" ? "100%" : "0",
"y2": props.gradientDirection === "bottom" ? "100%" : "0"
}, [gradientData.map((color, index) => createBaseVNode("stop", {
"offset": index / Math.max(gradientData.length - 1, 1),
"stop-color": color || "currentColor"
}, null))])]), hasLabels.value && createBaseVNode("g", {
"key": "labels",
"style": {
textAnchor: "middle",
dominantBaseline: "mathematical",
fill: "currentColor"
}
}, [parsedLabels.value.map((item, i) => createBaseVNode("text", {
"x": item.x + lineWidth.value / 2 + lineWidth.value / 2,
"y": parseInt(props.height, 10) - 4 + (parseInt(props.labelSize, 10) || 7 * 0.75),
"font-size": Number(props.labelSize) || 7
}, [slots.label?.({
index: i,
value: item.value
}) ?? item.value]))]), createBaseVNode("path", {
"ref": path,
"d": genPath2(props.fill),
"fill": props.fill ? `url(#${id.value})` : "none",
"stroke": props.fill ? "none" : `url(#${id.value})`
}, null), props.fill && createBaseVNode("path", {
"d": genPath2(false),
"fill": "none",
"stroke": props.color ?? props.gradient?.[0]
}, null)]);
});
}
});
// node_modules/vuetify/lib/components/VSparkline/VSparkline.js
var makeVSparklineProps = propsFactory({
type: {
type: String,
default: "trend"
},
...makeVBarlineProps(),
...makeVTrendlineProps()
}, "VSparkline");
var VSparkline = genericComponent()({
name: "VSparkline",
props: makeVSparklineProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
textColorClasses,
textColorStyles
} = useTextColor(() => props.color);
const hasLabels = computed(() => {
return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
});
const totalHeight = computed(() => {
let height = parseInt(props.height, 10);
if (hasLabels.value) height += parseInt(props.labelSize, 10) * 1.5;
return height;
});
useRender(() => {
const Tag = props.type === "trend" ? VTrendline : VBarline;
const lineProps = props.type === "trend" ? VTrendline.filterProps(props) : VBarline.filterProps(props);
return createVNode(Tag, mergeProps({
"key": props.type,
"class": textColorClasses.value,
"style": textColorStyles.value,
"viewBox": `0 0 ${props.width} ${parseInt(totalHeight.value, 10)}`
}, lineProps), slots);
});
}
});
// node_modules/vuetify/lib/components/VSpeedDial/VSpeedDial.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSpeedDial/VSpeedDial.css";
var makeVSpeedDialProps = propsFactory({
...makeComponentProps(),
...makeVMenuProps({
offset: 8,
minWidth: 0,
openDelay: 0,
closeDelay: 100,
location: "top center",
transition: "scale-transition"
})
}, "VSpeedDial");
var VSpeedDial = genericComponent()({
name: "VSpeedDial",
props: makeVSpeedDialProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const model = useProxiedModel(props, "modelValue");
const menuRef = ref();
const location = computed(() => {
const [y, x = "center"] = props.location?.split(" ") ?? [];
return `${y} ${x}`;
});
const locationClasses = computed(() => ({
[`v-speed-dial__content--${location.value.replace(" ", "-")}`]: true
}));
useRender(() => {
const menuProps = VMenu.filterProps(props);
return createVNode(VMenu, mergeProps(menuProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"class": props.class,
"style": props.style,
"contentClass": ["v-speed-dial__content", locationClasses.value, props.contentClass],
"location": location.value,
"ref": menuRef,
"transition": "fade-transition"
}), {
...slots,
default: (slotProps) => createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
size: "small"
}
}
}, {
default: () => [createVNode(MaybeTransition, {
"appear": true,
"group": true,
"transition": props.transition
}, {
default: () => [slots.default?.(slotProps)]
})]
})
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VStepper/VStepper.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VStepper/VStepper.css";
// node_modules/vuetify/lib/components/VStepper/shared.js
var VStepperSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-stepper");
// node_modules/vuetify/lib/components/VStepper/VStepperActions.js
var makeVStepperActionsProps = propsFactory({
color: String,
disabled: {
type: [Boolean, String],
default: false
},
prevText: {
type: String,
default: "$vuetify.stepper.prev"
},
nextText: {
type: String,
default: "$vuetify.stepper.next"
}
}, "VStepperActions");
var VStepperActions = genericComponent()({
name: "VStepperActions",
props: makeVStepperActionsProps(),
emits: {
"click:prev": () => true,
"click:next": () => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
t
} = useLocale();
function onClickPrev() {
emit("click:prev");
}
function onClickNext() {
emit("click:next");
}
useRender(() => {
const prevSlotProps = {
onClick: onClickPrev
};
const nextSlotProps = {
onClick: onClickNext
};
return createBaseVNode("div", {
"class": "v-stepper-actions"
}, [createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
disabled: ["prev", true].includes(props.disabled),
text: t(props.prevText),
variant: "text"
}
}
}, {
default: () => [slots.prev?.({
props: prevSlotProps
}) ?? createVNode(VBtn, prevSlotProps, null)]
}), createVNode(VDefaultsProvider, {
"defaults": {
VBtn: {
color: props.color,
disabled: ["next", true].includes(props.disabled),
text: t(props.nextText),
variant: "tonal"
}
}
}, {
default: () => [slots.next?.({
props: nextSlotProps
}) ?? createVNode(VBtn, nextSlotProps, null)]
})]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VStepper/VStepperHeader.js
var VStepperHeader = createSimpleFunctional("v-stepper-header");
// node_modules/vuetify/lib/components/VStepper/VStepperItem.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VStepper/VStepperItem.css";
var makeStepperItemProps = propsFactory({
color: String,
title: String,
subtitle: String,
complete: Boolean,
completeIcon: {
type: IconValue,
default: "$complete"
},
editable: Boolean,
editIcon: {
type: IconValue,
default: "$edit"
},
error: Boolean,
errorIcon: {
type: IconValue,
default: "$error"
},
icon: IconValue,
ripple: {
type: [Boolean, Object],
default: true
},
rules: {
type: Array,
default: () => []
}
}, "StepperItem");
var makeVStepperItemProps = propsFactory({
...makeStepperItemProps(),
...makeGroupItemProps()
}, "VStepperItem");
var VStepperItem = genericComponent()({
name: "VStepperItem",
directives: {
vRipple: ripple_default
},
props: makeVStepperItemProps(),
emits: {
"group:selected": (val) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const group = useGroupItem(props, VStepperSymbol, true);
const step = computed(() => group?.value.value ?? props.value);
const isValid = computed(() => props.rules.every((handler) => handler() === true));
const isClickable = computed(() => !props.disabled && props.editable);
const canEdit = computed(() => !props.disabled && props.editable);
const hasError = computed(() => props.error || !isValid.value);
const hasCompleted = computed(() => props.complete || props.rules.length > 0 && isValid.value);
const icon = computed(() => {
if (hasError.value) return props.errorIcon;
if (hasCompleted.value) return props.completeIcon;
if (group.isSelected.value && props.editable) return props.editIcon;
return props.icon;
});
const slotProps = computed(() => ({
canEdit: canEdit.value,
hasError: hasError.value,
hasCompleted: hasCompleted.value,
title: props.title,
subtitle: props.subtitle,
step: step.value,
value: props.value
}));
useRender(() => {
const hasColor = (!group || group.isSelected.value || hasCompleted.value || canEdit.value) && !hasError.value && !props.disabled;
const hasTitle = !!(props.title != null || slots.title);
const hasSubtitle = !!(props.subtitle != null || slots.subtitle);
function onClick() {
group?.toggle();
}
return withDirectives(createBaseVNode("button", {
"class": normalizeClass(["v-stepper-item", {
"v-stepper-item--complete": hasCompleted.value,
"v-stepper-item--disabled": props.disabled,
"v-stepper-item--error": hasError.value
}, group?.selectedClass.value]),
"disabled": !props.editable,
"type": "button",
"onClick": onClick
}, [isClickable.value && genOverlays(true, "v-stepper-item"), createVNode(VAvatar, {
"key": "stepper-avatar",
"class": "v-stepper-item__avatar",
"color": hasColor ? props.color : void 0,
"size": 24
}, {
default: () => [slots.icon?.(slotProps.value) ?? (icon.value ? createVNode(VIcon, {
"icon": icon.value
}, null) : step.value)]
}), createBaseVNode("div", {
"class": "v-stepper-item__content"
}, [hasTitle && createBaseVNode("div", {
"key": "title",
"class": "v-stepper-item__title"
}, [slots.title?.(slotProps.value) ?? props.title]), hasSubtitle && createBaseVNode("div", {
"key": "subtitle",
"class": "v-stepper-item__subtitle"
}, [slots.subtitle?.(slotProps.value) ?? props.subtitle]), slots.default?.(slotProps.value)])]), [[ripple_default, props.editable && props.ripple, null]]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VStepper/VStepperWindow.js
var makeVStepperWindowProps = propsFactory({
...omit(makeVWindowProps(), ["continuous", "nextIcon", "prevIcon", "showArrows", "touch", "mandatory"])
}, "VStepperWindow");
var VStepperWindow = genericComponent()({
name: "VStepperWindow",
props: makeVStepperWindowProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const group = inject(VStepperSymbol, null);
const _model = useProxiedModel(props, "modelValue");
const model = computed({
get() {
if (_model.value != null || !group) return _model.value;
return group.items.value.find((item) => group.selected.value.includes(item.id))?.value;
},
set(val) {
_model.value = val;
}
});
useRender(() => {
const windowProps = VWindow.filterProps(props);
return createVNode(VWindow, mergeProps({
"_as": "VStepperWindow"
}, windowProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"class": ["v-stepper-window", props.class],
"style": props.style,
"mandatory": false,
"touch": false
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VStepper/VStepperWindowItem.js
var makeVStepperWindowItemProps = propsFactory({
...makeVWindowItemProps()
}, "VStepperWindowItem");
var VStepperWindowItem = genericComponent()({
name: "VStepperWindowItem",
props: makeVStepperWindowItemProps(),
setup(props, _ref) {
let {
slots
} = _ref;
useRender(() => {
const windowItemProps = VWindowItem.filterProps(props);
return createVNode(VWindowItem, mergeProps({
"_as": "VStepperWindowItem"
}, windowItemProps, {
"class": ["v-stepper-window-item", props.class],
"style": props.style
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VStepper/VStepper.js
var makeStepperProps = propsFactory({
altLabels: Boolean,
bgColor: String,
completeIcon: IconValue,
editIcon: IconValue,
editable: Boolean,
errorIcon: IconValue,
hideActions: Boolean,
items: {
type: Array,
default: () => []
},
itemTitle: {
type: [String, Array, Function],
default: "title"
},
itemValue: {
type: [String, Array, Function],
default: "value"
},
itemProps: {
type: [Boolean, String, Array, Function],
default: "props"
},
nonLinear: Boolean,
flat: Boolean,
...makeDisplayProps()
}, "Stepper");
var makeVStepperProps = propsFactory({
...makeStepperProps(),
...makeGroupProps({
mandatory: "force",
selectedClass: "v-stepper-item--selected"
}),
...makeVSheetProps(),
...pick(makeVStepperActionsProps(), ["prevText", "nextText"])
}, "VStepper");
var VStepper = genericComponent()({
name: "VStepper",
props: makeVStepperProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const {
items: _items,
next,
prev,
selected
} = useGroup(props, VStepperSymbol);
const {
displayClasses,
mobile
} = useDisplay(props);
const {
completeIcon,
editIcon,
errorIcon,
color,
editable,
prevText,
nextText
} = toRefs(props);
const items = computed(() => props.items.map((item, index) => {
const title = getPropertyFromItem(item, props.itemTitle, item);
const value = getPropertyFromItem(item, props.itemValue, index + 1);
const itemProps = props.itemProps === true ? item : getPropertyFromItem(item, props.itemProps);
const _props = {
title,
value,
...itemProps
};
return {
title: _props.title,
value: _props.value,
props: _props,
raw: item
};
}));
const activeIndex = computed(() => {
return _items.value.findIndex((item) => selected.value.includes(item.id));
});
const disabled = computed(() => {
if (props.disabled) return props.disabled;
if (activeIndex.value === 0) return "prev";
if (activeIndex.value === _items.value.length - 1) return "next";
return false;
});
provideDefaults({
VStepperItem: {
editable,
errorIcon,
completeIcon,
editIcon,
prevText,
nextText
},
VStepperActions: {
color,
disabled,
prevText,
nextText
}
});
useRender(() => {
const sheetProps = VSheet.filterProps(props);
const hasHeader = !!(slots.header || props.items.length);
const hasWindow = props.items.length > 0;
const hasActions = !props.hideActions && !!(hasWindow || slots.actions);
return createVNode(VSheet, mergeProps(sheetProps, {
"color": props.bgColor,
"class": ["v-stepper", {
"v-stepper--alt-labels": props.altLabels,
"v-stepper--flat": props.flat,
"v-stepper--non-linear": props.nonLinear,
"v-stepper--mobile": mobile.value
}, displayClasses.value, props.class],
"style": props.style
}), {
default: () => [hasHeader && createVNode(VStepperHeader, {
"key": "stepper-header"
}, {
default: () => [items.value.map((_ref2, index) => {
let {
raw,
...item
} = _ref2;
return createBaseVNode(Fragment, null, [!!index && createVNode(VDivider, null, null), createVNode(VStepperItem, item.props, {
default: slots[`header-item.${item.value}`] ?? slots.header,
icon: slots.icon,
title: slots.title,
subtitle: slots.subtitle
})]);
})]
}), hasWindow && createVNode(VStepperWindow, {
"key": "stepper-window"
}, {
default: () => [items.value.map((item) => createVNode(VStepperWindowItem, {
"value": item.value
}, {
default: () => slots[`item.${item.value}`]?.(item) ?? slots.item?.(item)
}))]
}), slots.default?.({
prev,
next
}), hasActions && (slots.actions?.({
next,
prev
}) ?? createVNode(VStepperActions, {
"key": "stepper-actions",
"onClick:prev": prev,
"onClick:next": next
}, slots))]
});
});
return {
prev,
next
};
}
});
// node_modules/vuetify/lib/components/VSystemBar/VSystemBar.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VSystemBar/VSystemBar.css";
var makeVSystemBarProps = propsFactory({
color: String,
height: [Number, String],
window: Boolean,
...makeComponentProps(),
...makeElevationProps(),
...makeLayoutItemProps(),
...makeRoundedProps(),
...makeTagProps(),
...makeThemeProps()
}, "VSystemBar");
var VSystemBar = genericComponent()({
name: "VSystemBar",
props: makeVSystemBarProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const {
elevationClasses
} = useElevation(props);
const {
roundedClasses
} = useRounded(props);
const {
ssrBootStyles
} = useSsrBoot();
const height = computed(() => props.height ?? (props.window ? 32 : 24));
const {
layoutItemStyles
} = useLayoutItem({
id: props.name,
order: computed(() => parseInt(props.order, 10)),
position: shallowRef("top"),
layoutSize: height,
elementSize: height,
active: computed(() => true),
absolute: toRef(() => props.absolute)
});
useRender(() => createVNode(props.tag, {
"class": normalizeClass(["v-system-bar", {
"v-system-bar--window": props.window
}, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
"style": normalizeStyle([backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, props.style])
}, slots));
return {};
}
});
// node_modules/vuetify/lib/components/VTabs/VTab.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTabs/VTab.css";
// node_modules/vuetify/lib/components/VTabs/shared.js
var VTabsSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-tabs");
// node_modules/vuetify/lib/components/VTabs/VTab.js
var makeVTabProps = propsFactory({
fixed: Boolean,
sliderColor: String,
sliderTransition: String,
sliderTransitionDuration: [String, Number],
hideSlider: Boolean,
inset: Boolean,
direction: {
type: String,
default: "horizontal"
},
...omit(makeVBtnProps({
selectedClass: "v-tab--selected",
variant: "text"
}), ["active", "block", "flat", "location", "position", "symbol"])
}, "VTab");
var VTab = genericComponent()({
name: "VTab",
props: makeVTabProps(),
setup(props, _ref) {
let {
slots,
attrs
} = _ref;
const {
textColorClasses: sliderColorClasses,
textColorStyles: sliderColorStyles
} = useTextColor(() => props.sliderColor);
const {
backgroundColorClasses: insetColorClasses,
backgroundColorStyles: insetColorStyles
} = useBackgroundColor(() => props.sliderColor);
const rootEl = ref();
const sliderEl = ref();
const isHorizontal = computed(() => props.direction === "horizontal");
const isSelected = computed(() => rootEl.value?.group?.isSelected.value ?? false);
function fade(nextEl, prevEl) {
return {
opacity: [0, 1]
};
}
function grow(nextEl, prevEl) {
return props.direction === "vertical" ? {
transform: ["scaleY(0)", "scaleY(1)"]
} : {
transform: ["scaleX(0)", "scaleX(1)"]
};
}
function shift(nextEl, prevEl) {
const prevBox = prevEl.getBoundingClientRect();
const nextBox = nextEl.getBoundingClientRect();
const xy = isHorizontal.value ? "x" : "y";
const XY = isHorizontal.value ? "X" : "Y";
const rightBottom = isHorizontal.value ? "right" : "bottom";
const widthHeight = isHorizontal.value ? "width" : "height";
const prevPos = prevBox[xy];
const nextPos = nextBox[xy];
const delta = prevPos > nextPos ? prevBox[rightBottom] - nextBox[rightBottom] : prevBox[xy] - nextBox[xy];
const origin = Math.sign(delta) > 0 ? isHorizontal.value ? "right" : "bottom" : Math.sign(delta) < 0 ? isHorizontal.value ? "left" : "top" : "center";
const size = Math.abs(delta) + (Math.sign(delta) < 0 ? prevBox[widthHeight] : nextBox[widthHeight]);
const scale = size / Math.max(prevBox[widthHeight], nextBox[widthHeight]) || 0;
const initialScale = prevBox[widthHeight] / nextBox[widthHeight] || 0;
const sigma = 1.5;
return {
transform: [`translate${XY}(${delta}px) scale${XY}(${initialScale})`, `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`, "none"],
transformOrigin: Array(3).fill(origin)
};
}
function updateSlider(_ref2) {
let {
value
} = _ref2;
if (value) {
const prevEl = rootEl.value?.$el.parentElement?.querySelector(".v-tab--selected .v-tab__slider");
const nextEl = sliderEl.value;
if (!prevEl || !nextEl) return;
const color = getComputedStyle(prevEl).color;
const keyframes = {
fade,
grow,
shift
}[props.sliderTransition ?? "shift"] ?? shift;
const duration = Number(props.sliderTransitionDuration) || ({
fade: 400,
grow: 350,
shift: 225
}[props.sliderTransition ?? "shift"] ?? 225);
animate(nextEl, {
backgroundColor: [color, "currentcolor"],
...keyframes(nextEl, prevEl)
}, {
duration,
easing: standardEasing
});
}
}
useRender(() => {
const btnProps = VBtn.filterProps(props);
return createVNode(VBtn, mergeProps({
"symbol": VTabsSymbol,
"ref": rootEl,
"class": ["v-tab", props.class, isSelected.value && props.inset ? insetColorClasses.value : []],
"style": [props.style, isSelected.value && props.inset ? insetColorStyles.value : []],
"tabindex": isSelected.value ? 0 : -1,
"role": "tab",
"aria-selected": String(isSelected.value),
"active": false
}, btnProps, attrs, {
"block": props.fixed,
"maxWidth": props.fixed ? 300 : void 0,
"onGroup:selected": updateSlider
}), {
...slots,
default: () => createBaseVNode(Fragment, null, [slots.default?.() ?? props.text, !props.hideSlider && createBaseVNode("div", {
"ref": sliderEl,
"class": normalizeClass(["v-tab__slider", sliderColorClasses.value]),
"style": normalizeStyle(sliderColorStyles.value)
}, null)])
});
});
return forwardRefs({}, rootEl);
}
});
// node_modules/vuetify/lib/components/VTabs/VTabs.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTabs/VTabs.css";
// node_modules/vuetify/lib/components/VTabs/VTabsWindow.js
var makeVTabsWindowProps = propsFactory({
...omit(makeVWindowProps(), ["continuous", "nextIcon", "prevIcon", "showArrows", "touch", "mandatory"])
}, "VTabsWindow");
var VTabsWindow = genericComponent()({
name: "VTabsWindow",
props: makeVTabsWindowProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const group = inject(VTabsSymbol, null);
const _model = useProxiedModel(props, "modelValue");
const model = computed({
get() {
if (_model.value != null || !group) return _model.value;
return group.items.value.find((item) => group.selected.value.includes(item.id))?.value;
},
set(val) {
_model.value = val;
}
});
useRender(() => {
const windowProps = VWindow.filterProps(props);
return createVNode(VWindow, mergeProps({
"_as": "VTabsWindow"
}, windowProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"class": ["v-tabs-window", props.class],
"style": props.style,
"mandatory": false,
"touch": false
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VTabs/VTabsWindowItem.js
var makeVTabsWindowItemProps = propsFactory({
...makeVWindowItemProps()
}, "VTabsWindowItem");
var VTabsWindowItem = genericComponent()({
name: "VTabsWindowItem",
props: makeVTabsWindowItemProps(),
setup(props, _ref) {
let {
slots
} = _ref;
useRender(() => {
const windowItemProps = VWindowItem.filterProps(props);
return createVNode(VWindowItem, mergeProps({
"_as": "VTabsWindowItem"
}, windowItemProps, {
"class": ["v-tabs-window-item", props.class],
"style": props.style
}), slots);
});
return {};
}
});
// node_modules/vuetify/lib/components/VTabs/VTabs.js
function parseItems(items) {
if (!items) return [];
return items.map((item) => {
if (!isObject(item)) return {
text: item,
value: item
};
return item;
});
}
var makeVTabsProps = propsFactory({
alignTabs: {
type: String,
default: "start"
},
color: String,
fixedTabs: Boolean,
items: {
type: Array,
default: () => []
},
stacked: Boolean,
bgColor: String,
grow: Boolean,
height: {
type: [Number, String],
default: void 0
},
hideSlider: Boolean,
inset: Boolean,
insetPadding: [String, Number],
insetRadius: [String, Number],
sliderColor: String,
...pick(makeVTabProps(), ["spaced", "sliderTransition", "sliderTransitionDuration"]),
...makeVSlideGroupProps({
mandatory: "force",
selectedClass: "v-tab-item--selected"
}),
...makeDensityProps(),
...makeTagProps()
}, "VTabs");
var VTabs = genericComponent()({
name: "VTabs",
props: makeVTabsProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
attrs,
slots
} = _ref;
const model = useProxiedModel(props, "modelValue");
const items = computed(() => parseItems(props.items));
const {
densityClasses
} = useDensity(props);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.bgColor);
const {
scopeId
} = useScopeId();
provideDefaults({
VTab: {
color: toRef(props, "color"),
direction: toRef(props, "direction"),
stacked: toRef(props, "stacked"),
fixed: toRef(props, "fixedTabs"),
inset: toRef(props, "inset"),
sliderColor: toRef(props, "sliderColor"),
sliderTransition: toRef(props, "sliderTransition"),
sliderTransitionDuration: toRef(props, "sliderTransitionDuration"),
hideSlider: toRef(props, "hideSlider")
}
});
useRender(() => {
const slideGroupProps = VSlideGroup.filterProps(props);
const hasWindow = !!(slots.window || props.items.length > 0);
return createBaseVNode(Fragment, null, [createVNode(VSlideGroup, mergeProps(slideGroupProps, {
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"class": ["v-tabs", `v-tabs--${props.direction}`, `v-tabs--align-tabs-${props.alignTabs}`, {
"v-tabs--fixed-tabs": props.fixedTabs,
"v-tabs--grow": props.grow,
"v-tabs--inset": props.inset,
"v-tabs--stacked": props.stacked
}, densityClasses.value, backgroundColorClasses.value, props.class],
"style": [{
"--v-tabs-height": convertToUnit(props.height),
"--v-tabs-inset-padding": props.inset ? convertToUnit(props.insetPadding) : void 0,
"--v-tabs-inset-radius": props.inset ? convertToUnit(props.insetRadius) : void 0
}, backgroundColorStyles.value, props.style],
"role": "tablist",
"symbol": VTabsSymbol
}, scopeId, attrs), {
default: slots.default ?? (() => items.value.map((item) => slots.tab?.({
item
}) ?? createVNode(VTab, mergeProps(item, {
"key": item.text,
"value": item.value,
"spaced": props.spaced
}), {
default: slots[`tab.${item.value}`] ? () => slots[`tab.${item.value}`]?.({
item
}) : void 0
}))),
prev: slots.prev,
next: slots.next
}), hasWindow && createVNode(VTabsWindow, mergeProps({
"modelValue": model.value,
"onUpdate:modelValue": ($event) => model.value = $event,
"key": "tabs-window"
}, scopeId), {
default: () => [items.value.map((item) => slots.item?.({
item
}) ?? createVNode(VTabsWindowItem, {
"value": item.value
}, {
default: () => slots[`item.${item.value}`]?.({
item
})
})), slots.window?.()]
})]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VThemeProvider/VThemeProvider.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VThemeProvider/VThemeProvider.css";
var makeVThemeProviderProps = propsFactory({
withBackground: Boolean,
...makeComponentProps(),
...makeThemeProps(),
...makeTagProps()
}, "VThemeProvider");
var VThemeProvider = genericComponent()({
name: "VThemeProvider",
props: makeVThemeProviderProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
return () => {
if (!props.withBackground) return slots.default?.();
return createVNode(props.tag, {
"class": normalizeClass(["v-theme-provider", themeClasses.value, props.class]),
"style": normalizeStyle(props.style)
}, {
default: () => [slots.default?.()]
});
};
}
});
// node_modules/vuetify/lib/components/VTimeline/VTimeline.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTimeline/VTimeline.css";
// node_modules/vuetify/lib/components/VTimeline/VTimelineDivider.js
var makeVTimelineDividerProps = propsFactory({
dotColor: String,
fillDot: Boolean,
hideDot: Boolean,
icon: IconValue,
iconColor: String,
lineColor: String,
...makeComponentProps(),
...makeRoundedProps(),
...makeSizeProps(),
...makeElevationProps()
}, "VTimelineDivider");
var VTimelineDivider = genericComponent()({
name: "VTimelineDivider",
props: makeVTimelineDividerProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
sizeClasses,
sizeStyles
} = useSize(props, "v-timeline-divider__dot");
const {
backgroundColorStyles,
backgroundColorClasses
} = useBackgroundColor(() => props.dotColor);
const {
roundedClasses
} = useRounded(props, "v-timeline-divider__dot");
const {
elevationClasses
} = useElevation(props);
const {
backgroundColorClasses: lineColorClasses,
backgroundColorStyles: lineColorStyles
} = useBackgroundColor(() => props.lineColor);
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-timeline-divider", {
"v-timeline-divider--fill-dot": props.fillDot
}, props.class]),
"style": normalizeStyle(props.style)
}, [createBaseVNode("div", {
"class": normalizeClass(["v-timeline-divider__before", lineColorClasses.value]),
"style": normalizeStyle(lineColorStyles.value)
}, null), !props.hideDot && createBaseVNode("div", {
"key": "dot",
"class": normalizeClass(["v-timeline-divider__dot", elevationClasses.value, roundedClasses.value, sizeClasses.value]),
"style": normalizeStyle(sizeStyles.value)
}, [createBaseVNode("div", {
"class": normalizeClass(["v-timeline-divider__inner-dot", backgroundColorClasses.value, roundedClasses.value]),
"style": normalizeStyle(backgroundColorStyles.value)
}, [!slots.default ? createVNode(VIcon, {
"key": "icon",
"color": props.iconColor,
"icon": props.icon,
"size": props.size
}, null) : createVNode(VDefaultsProvider, {
"key": "icon-defaults",
"disabled": !props.icon,
"defaults": {
VIcon: {
color: props.iconColor,
icon: props.icon,
size: props.size
}
}
}, slots.default)])]), createBaseVNode("div", {
"class": normalizeClass(["v-timeline-divider__after", lineColorClasses.value]),
"style": normalizeStyle(lineColorStyles.value)
}, null)]));
return {};
}
});
// node_modules/vuetify/lib/components/VTimeline/VTimelineItem.js
var makeVTimelineItemProps = propsFactory({
density: String,
dotColor: String,
fillDot: Boolean,
hideDot: Boolean,
hideOpposite: {
type: Boolean,
default: void 0
},
icon: IconValue,
iconColor: String,
lineInset: [Number, String],
side: {
type: String,
validator: (v) => v == null || ["start", "end"].includes(v)
},
...makeComponentProps(),
...makeDimensionProps(),
...makeElevationProps(),
...makeRoundedProps(),
...makeSizeProps(),
...makeTagProps()
}, "VTimelineItem");
var VTimelineItem = genericComponent()({
name: "VTimelineItem",
props: makeVTimelineItemProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
dimensionStyles
} = useDimension(props);
const dotSize = shallowRef(0);
const dotRef = ref();
watch(dotRef, (newValue) => {
if (!newValue) return;
dotSize.value = newValue.$el.querySelector(".v-timeline-divider__dot")?.getBoundingClientRect().width ?? 0;
}, {
flush: "post"
});
useRender(() => createBaseVNode("div", {
"class": normalizeClass(["v-timeline-item", {
"v-timeline-item--fill-dot": props.fillDot,
"v-timeline-item--side-start": props.side === "start",
"v-timeline-item--side-end": props.side === "end"
}, props.class]),
"style": normalizeStyle([{
"--v-timeline-dot-size": convertToUnit(dotSize.value),
"--v-timeline-line-inset": props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0)
}, props.style])
}, [createBaseVNode("div", {
"class": "v-timeline-item__body",
"style": normalizeStyle(dimensionStyles.value)
}, [slots.default?.()]), createVNode(VTimelineDivider, {
"ref": dotRef,
"hideDot": props.hideDot,
"icon": props.icon,
"iconColor": props.iconColor,
"size": props.size,
"elevation": props.elevation,
"dotColor": props.dotColor,
"fillDot": props.fillDot,
"rounded": props.rounded
}, {
default: slots.icon
}), props.density !== "compact" && createBaseVNode("div", {
"class": "v-timeline-item__opposite"
}, [!props.hideOpposite && slots.opposite?.()])]));
return {};
}
});
// node_modules/vuetify/lib/components/VTimeline/VTimeline.js
var makeVTimelineProps = propsFactory({
align: {
type: String,
default: "center",
validator: (v) => ["center", "start"].includes(v)
},
direction: {
type: String,
default: "vertical",
validator: (v) => ["vertical", "horizontal"].includes(v)
},
justify: {
type: String,
default: "auto",
validator: (v) => ["auto", "center"].includes(v)
},
side: {
type: String,
validator: (v) => v == null || ["start", "end"].includes(v)
},
lineThickness: {
type: [String, Number],
default: 2
},
lineColor: String,
truncateLine: {
type: String,
validator: (v) => ["start", "end", "both"].includes(v)
},
...pick(makeVTimelineItemProps({
lineInset: 0
}), ["dotColor", "fillDot", "hideOpposite", "iconColor", "lineInset", "size"]),
...makeComponentProps(),
...makeDensityProps(),
...makeTagProps(),
...makeThemeProps()
}, "VTimeline");
var VTimeline = genericComponent()({
name: "VTimeline",
props: makeVTimelineProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
densityClasses
} = useDensity(props);
const {
rtlClasses
} = useRtl();
provideDefaults({
VTimelineDivider: {
lineColor: toRef(() => props.lineColor)
},
VTimelineItem: {
density: toRef(() => props.density),
dotColor: toRef(() => props.dotColor),
fillDot: toRef(() => props.fillDot),
hideOpposite: toRef(() => props.hideOpposite),
iconColor: toRef(() => props.iconColor),
lineColor: toRef(() => props.lineColor),
lineInset: toRef(() => props.lineInset),
size: toRef(() => props.size)
}
});
const sideClasses = computed(() => {
const side = props.side ? props.side : props.density !== "default" ? "end" : null;
return side && `v-timeline--side-${side}`;
});
const truncateClasses = computed(() => {
const classes = ["v-timeline--truncate-line-start", "v-timeline--truncate-line-end"];
switch (props.truncateLine) {
case "both":
return classes;
case "start":
return classes[0];
case "end":
return classes[1];
default:
return null;
}
});
useRender(() => createVNode(props.tag, {
"class": normalizeClass(["v-timeline", `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, `v-timeline--justify-${props.justify}`, truncateClasses.value, {
"v-timeline--inset-line": !!props.lineInset
}, themeClasses.value, densityClasses.value, sideClasses.value, rtlClasses.value, props.class]),
"style": normalizeStyle([{
"--v-timeline-line-thickness": convertToUnit(props.lineThickness)
}, props.style])
}, slots));
return {};
}
});
// node_modules/vuetify/lib/components/VTimePicker/VTimePicker.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTimePicker/VTimePicker.css";
// node_modules/vuetify/lib/components/VTimePicker/VTimePickerClock.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTimePicker/VTimePickerClock.css";
var makeVTimePickerClockProps = propsFactory({
allowedValues: Function,
ampm: Boolean,
color: String,
disabled: Boolean,
displayedValue: null,
double: Boolean,
format: {
type: Function,
default: (val) => val
},
max: {
type: Number,
required: true
},
min: {
type: Number,
required: true
},
scrollable: Boolean,
readonly: Boolean,
rotate: {
type: Number,
default: 0
},
step: {
type: Number,
default: 1
},
modelValue: {
type: Number
}
}, "VTimePickerClock");
var VTimePickerClock = genericComponent()({
name: "VTimePickerClock",
props: makeVTimePickerClockProps(),
emits: {
change: (val) => true,
input: (val) => true
},
setup(props, _ref) {
let {
emit
} = _ref;
const clockRef = ref(null);
const innerClockRef = ref(null);
const inputValue = ref(void 0);
const isDragging = ref(false);
const valueOnMouseDown = ref(null);
const valueOnMouseUp = ref(null);
const emitChangeDebounced = debounce((value) => emit("change", value), 750);
const {
textColorClasses,
textColorStyles
} = useTextColor(() => props.color);
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(() => props.color);
const count = computed(() => props.max - props.min + 1);
const roundCount = computed(() => props.double ? count.value / 2 : count.value);
const degreesPerUnit = computed(() => 360 / roundCount.value);
const degrees = computed(() => degreesPerUnit.value * Math.PI / 180);
const displayedValue = computed(() => props.modelValue == null ? props.min : props.modelValue);
const innerRadiusScale = computed(() => 0.62);
const genChildren = computed(() => {
const children = [];
for (let value = props.min; value <= props.max; value = value + props.step) {
children.push(value);
}
return children;
});
watch(() => props.modelValue, (val) => {
inputValue.value = val;
});
function update(value) {
if (inputValue.value !== value) {
inputValue.value = value;
}
emit("input", value);
}
function isAllowed(value) {
return !props.allowedValues || props.allowedValues(value);
}
function wheel(e) {
if (!props.scrollable || props.disabled) return;
e.preventDefault();
const delta = Math.sign(-e.deltaY || 1);
let value = displayedValue.value;
do {
value = value + delta;
value = (value - props.min + count.value) % count.value + props.min;
} while (!isAllowed(value) && value !== displayedValue.value);
if (value !== props.displayedValue) {
update(value);
}
emitChangeDebounced(value);
}
function isInner(value) {
return props.double && value - props.min >= roundCount.value;
}
function handScale(value) {
return isInner(value) ? innerRadiusScale.value : 1;
}
function getPosition(value) {
const rotateRadians = props.rotate * Math.PI / 180;
return {
x: Math.sin((value - props.min) * degrees.value + rotateRadians) * handScale(value),
y: -Math.cos((value - props.min) * degrees.value + rotateRadians) * handScale(value)
};
}
function angleToValue(angle2, insideClick) {
const value = (Math.round(angle2 / degreesPerUnit.value) + (insideClick ? roundCount.value : 0)) % count.value + props.min;
if (angle2 < 360 - degreesPerUnit.value / 2) return value;
return insideClick ? props.max - roundCount.value + 1 : props.min;
}
function getTransform(i) {
const {
x,
y
} = getPosition(i);
return {
left: `${Math.round(50 + x * 50)}%`,
top: `${Math.round(50 + y * 50)}%`
};
}
function euclidean(p0, p1) {
const dx = p1.x - p0.x;
const dy = p1.y - p0.y;
return Math.sqrt(dx * dx + dy * dy);
}
function angle(center, p1) {
const value = 2 * Math.atan2(p1.y - center.y - euclidean(center, p1), p1.x - center.x);
return Math.abs(value * 180 / Math.PI);
}
function setMouseDownValue(value) {
if (valueOnMouseDown.value === null) {
valueOnMouseDown.value = value;
}
valueOnMouseUp.value = value;
update(value);
}
function onDragMove(e) {
e.preventDefault();
if (!isDragging.value && e.type !== "click" || !clockRef.value) return;
const {
width,
top,
left
} = clockRef.value?.getBoundingClientRect();
const {
width: innerWidth
} = innerClockRef.value?.getBoundingClientRect() ?? {
width: 0
};
const {
clientX,
clientY
} = "touches" in e ? e.touches[0] : e;
const center = {
x: width / 2,
y: -width / 2
};
const coords = {
x: clientX - left,
y: top - clientY
};
const handAngle = Math.round(angle(center, coords) - props.rotate + 360) % 360;
const insideClick = props.double && euclidean(center, coords) < (innerWidth + innerWidth * innerRadiusScale.value) / 4;
const checksCount = Math.ceil(15 / degreesPerUnit.value);
let value;
for (let i = 0; i < checksCount; i++) {
value = angleToValue(handAngle + i * degreesPerUnit.value, insideClick);
if (isAllowed(value)) return setMouseDownValue(value);
value = angleToValue(handAngle - i * degreesPerUnit.value, insideClick);
if (isAllowed(value)) return setMouseDownValue(value);
}
}
function onMouseDown(e) {
if (props.disabled) return;
e.preventDefault();
window.addEventListener("mousemove", onDragMove);
window.addEventListener("touchmove", onDragMove);
window.addEventListener("mouseup", onMouseUp);
window.addEventListener("touchend", onMouseUp);
valueOnMouseDown.value = null;
valueOnMouseUp.value = null;
isDragging.value = true;
onDragMove(e);
}
function onMouseUp(e) {
e.stopPropagation();
removeListeners();
isDragging.value = false;
if (valueOnMouseUp.value !== null && isAllowed(valueOnMouseUp.value)) {
emit("change", valueOnMouseUp.value);
}
}
function removeListeners() {
window.removeEventListener("mousemove", onDragMove);
window.removeEventListener("touchmove", onDragMove);
window.removeEventListener("mouseup", onMouseUp);
window.removeEventListener("touchend", onMouseUp);
}
onScopeDispose(removeListeners);
useRender(() => {
return createBaseVNode("div", {
"class": normalizeClass([{
"v-time-picker-clock": true,
"v-time-picker-clock--indeterminate": props.modelValue == null,
"v-time-picker-clock--readonly": props.readonly
}]),
"onMousedown": onMouseDown,
"onTouchstart": onMouseDown,
"onWheel": wheel,
"ref": clockRef
}, [createBaseVNode("div", {
"class": "v-time-picker-clock__inner",
"ref": innerClockRef
}, [createBaseVNode("div", {
"class": normalizeClass([{
"v-time-picker-clock__hand": true,
"v-time-picker-clock__hand--inner": isInner(props.modelValue)
}, textColorClasses.value]),
"style": normalizeStyle([{
transform: `rotate(${props.rotate + degreesPerUnit.value * (displayedValue.value - props.min)}deg) scaleY(${handScale(displayedValue.value)})`
}, textColorStyles.value])
}, null), genChildren.value.map((value) => {
const isActive = value === displayedValue.value;
return createBaseVNode("div", {
"class": normalizeClass([{
"v-time-picker-clock__item": true,
"v-time-picker-clock__item--active": isActive,
"v-time-picker-clock__item--disabled": props.disabled || !isAllowed(value)
}, isActive && backgroundColorClasses.value]),
"style": normalizeStyle([getTransform(value), isActive && backgroundColorStyles.value])
}, [createBaseVNode("span", null, [props.format(value)])]);
})])]);
});
}
});
// node_modules/vuetify/lib/components/VTimePicker/VTimePickerControls.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTimePicker/VTimePickerControls.css";
// node_modules/vuetify/lib/components/VTimePicker/VTimePickerField.js
var makeVTimePickerFieldProps = propsFactory({
active: Boolean,
color: String,
disabled: Boolean,
label: String,
modelValue: String,
readonly: Boolean
}, "VTimePickerField");
var VTimePickerField = genericComponent()({
name: "VTimePickerField",
inheritAttrs: false,
props: makeVTimePickerFieldProps(),
emits: {
"update:modelValue": (v) => true
},
setup(props, _ref) {
let {
emit,
attrs
} = _ref;
const {
textColorClasses,
textColorStyles
} = useTextColor(() => props.color);
const vTextInputRef = ref();
const isFocused = shallowRef(false);
function onKeydown(e) {
if (["Backspace", "Delete"].includes(e.key)) {
e.preventDefault();
const target = e.target;
target.value = "";
emit("update:modelValue", null);
}
}
useRender(() => {
return createBaseVNode("div", null, [createVNode(VTextField, mergeProps({
"ref": vTextInputRef,
"_as": "VTimePickerField",
"autocomplete": "off",
"class": ["v-time-picker-controls__time__field", {
"v-time-picker-controls__time__field--active": props.active
}, props.active ? textColorClasses.value : []],
"style": props.active ? textColorStyles.value : [],
"disabled": props.disabled,
"variant": "solo-filled",
"inputmode": "numeric",
"hideDetails": true,
"flat": true,
"modelValue": props.modelValue ?? (isFocused.value ? "" : "--"),
"onUpdate:modelValue": (v) => emit("update:modelValue", v),
"onKeydown": onKeydown,
"onFocus": () => isFocused.value = true,
"onBlur": () => isFocused.value = false
}, attrs), null), createBaseVNode("div", {
"class": "v-time-picker-controls__field-label"
}, [props.label])]);
});
return forwardRefs({}, vTextInputRef);
}
});
// node_modules/vuetify/lib/components/VTimePicker/util.js
function pad(n) {
let length = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 2;
return String(n).padStart(length, "0");
}
function convert24to12(hour) {
return hour ? (hour - 1) % 12 + 1 : 12;
}
function convert12to24(hour, period) {
return hour % 12 + (period === "pm" ? 12 : 0);
}
function extractInteger(v) {
const digits = v.replaceAll(/\D/g, "");
return digits.length > 0 ? Number(digits) : null;
}
function incrementHour(hour, increment, period) {
if (period) {
if (hour === 12 && increment) {
return {
value: 1
};
}
if (hour === 11 && increment) {
return {
value: 12,
togglePeriod: true
};
}
if (hour === 12 && !increment) {
return {
value: 11,
togglePeriod: true
};
}
if (hour === 1 && !increment) {
return {
value: 12
};
}
} else {
if (hour === 23 && increment) {
return {
value: 0
};
}
if (hour === 0 && !increment) {
return {
value: 23
};
}
}
return {
value: hour + (increment ? 1 : -1)
};
}
function incrementMinuteOrSecond(val, increment) {
if (val === 59 && increment) return 0;
if (val === 0 && !increment) return 59;
return val + (increment ? 1 : -1);
}
// node_modules/vuetify/lib/components/VTimePicker/VTimePickerControls.js
var makeVTimePickerControlsProps = propsFactory({
ampm: Boolean,
color: String,
disabled: Boolean,
hour: [Number, String],
minute: [Number, String],
second: [Number, String],
period: String,
readonly: Boolean,
useSeconds: Boolean,
value: Number,
viewMode: String
}, "VTimePickerControls");
var VTimePickerControls = genericComponent()({
name: "VTimePickerControls",
props: makeVTimePickerControlsProps(),
emits: {
"update:period": (data) => true,
"update:viewMode": (data) => true,
"update:hour": (v) => true,
"update:minute": (v) => true,
"update:second": (v) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
t
} = useLocale();
const transformHours = {
in: (v) => {
if (v == null || isNaN(Number(v))) return null;
const val = Number(v);
return props.ampm ? pad(convert24to12(val)) : pad(val);
},
out: (v) => {
if (isNaN(Number(v)) || v == null || v === "") return null;
const val = typeof v === "string" ? extractInteger(v) : Number(v);
if (val === null) return null;
return props.ampm ? convert12to24(val, props.period ?? "am") : clamp(val, 0, 23);
}
};
const hour = useProxiedModel(props, "hour", void 0, transformHours.in, transformHours.out);
const transformMinutesOrSeconds = {
in: (v) => v != null && !isNaN(Number(v)) ? pad(`${v}`) : null,
out: (v) => {
if (isNaN(Number(v)) || v == null || v === "") return null;
const val = typeof v === "string" ? extractInteger(v) : Number(v);
return val !== null ? clamp(val, 0, 59) : null;
}
};
const minute = useProxiedModel(props, "minute", void 0, transformMinutesOrSeconds.in, transformMinutesOrSeconds.out);
const second = useProxiedModel(props, "second", void 0, transformMinutesOrSeconds.in, transformMinutesOrSeconds.out);
function onHourFieldKeydown(e) {
if (!["ArrowUp", "ArrowDown"].includes(e.key)) return;
e.preventDefault();
e.stopPropagation();
const current = Number(hour.value ?? 0);
const period = props.ampm ? props.period ?? "am" : null;
const {
value,
togglePeriod
} = incrementHour(current, e.key === "ArrowUp", period);
hour.value = pad(value);
if (togglePeriod) {
emit("update:period", props.period === "am" ? "pm" : "am");
}
}
function onMinuteFieldKeydown(e) {
if (!["ArrowUp", "ArrowDown"].includes(e.key)) return;
e.preventDefault();
e.stopPropagation();
minute.value = incrementMinuteOrSecond(Number(minute.value), e.key === "ArrowUp");
}
function onSecondFieldKeydown(e) {
if (!["ArrowUp", "ArrowDown"].includes(e.key)) return;
e.preventDefault();
e.stopPropagation();
second.value = incrementMinuteOrSecond(Number(second.value), e.key === "ArrowUp");
}
function createInputInterceptor(valueTransformOut, compare, apply) {
return (e) => {
if (!e.data) return;
const inputElement = e.target;
const {
value: existingTxt,
selectionStart,
selectionEnd
} = inputElement ?? {};
if (extractInteger(e.data) === null) {
e.preventDefault();
return;
}
const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
if (potentialNewInputVal.length > 2) {
if (selectionStart === selectionEnd && selectionEnd === 0 && e.data.trim().startsWith("0")) {
e.preventDefault();
inputElement.value = potentialNewInputVal.trim().substring(0, 2);
apply(inputElement.value);
if (e.data.trim().length === 1) {
inputElement.setSelectionRange(1, 1);
}
return;
}
if (selectionStart === selectionEnd && selectionEnd === 1 && existingTxt.startsWith("0")) {
e.preventDefault();
inputElement.value = potentialNewInputVal.trim().substring(0, 2);
apply(inputElement.value);
return;
}
const maxValue = props.viewMode === "hour" ? props.ampm ? 12 : 23 : 59;
const value = extractInteger(potentialNewInputVal);
if (value > maxValue) {
e.preventDefault();
inputElement.value = pad(String(extractInteger(e.data)).substring(0, 2));
apply(inputElement.value);
return;
}
}
const potentialNewNumber = valueTransformOut(potentialNewInputVal);
if (compare(potentialNewNumber)) {
e.preventDefault();
}
};
}
const hourInputRef = ref();
const minuteInputRef = ref();
const secondInputRef = ref();
watch(() => props.viewMode, (_, old) => {
switch (old) {
case "hour":
hourInputRef.value.blur();
break;
case "minute":
minuteInputRef.value.blur();
break;
case "second":
secondInputRef.value.blur();
break;
}
});
const hourInputFilter = createInputInterceptor(transformHours.out, (v) => transformHours.in(v) === hour.value, (v) => hour.value = v);
const minuteInputFilter = createInputInterceptor(transformMinutesOrSeconds.out, (v) => transformMinutesOrSeconds.in(v) === minute.value, (v) => minute.value = v);
const secondInputFilter = createInputInterceptor(transformMinutesOrSeconds.out, (v) => transformMinutesOrSeconds.in(v) === second.value, (v) => second.value = v);
useRender(() => {
return createBaseVNode("div", {
"class": "v-time-picker-controls"
}, [createBaseVNode("div", {
"class": normalizeClass({
"v-time-picker-controls__time": true,
"v-time-picker-controls__time--with-ampm": props.ampm,
"v-time-picker-controls__time--with-seconds": props.useSeconds
})
}, [createVNode(VTimePickerField, {
"ref": hourInputRef,
"active": props.viewMode === "hour",
"color": props.color,
"disabled": props.disabled,
"label": t("$vuetify.timePicker.hour"),
"modelValue": hour.value,
"onUpdate:modelValue": (v) => hour.value = v,
"onKeydown": onHourFieldKeydown,
"onBeforeinput": hourInputFilter,
"onFocus": () => emit("update:viewMode", "hour")
}, null), createBaseVNode("span", {
"class": "v-time-picker-controls__time__separator"
}, [createTextVNode(":")]), createVNode(VTimePickerField, {
"ref": minuteInputRef,
"active": props.viewMode === "minute",
"color": props.color,
"disabled": props.disabled,
"label": t("$vuetify.timePicker.minute"),
"modelValue": minute.value,
"onUpdate:modelValue": (v) => minute.value = v,
"onKeydown": onMinuteFieldKeydown,
"onBeforeinput": minuteInputFilter,
"onFocus": () => emit("update:viewMode", "minute")
}, null), props.useSeconds && createBaseVNode("span", {
"key": "secondsDivider",
"class": "v-time-picker-controls__time__separator"
}, [createTextVNode(":")]), props.useSeconds && createVNode(VTimePickerField, {
"key": "secondsVal",
"ref": secondInputRef,
"active": props.viewMode === "second",
"color": props.color,
"disabled": props.disabled,
"label": t("$vuetify.timePicker.second"),
"modelValue": second.value,
"onUpdate:modelValue": (v) => second.value = v,
"onKeydown": onSecondFieldKeydown,
"onBeforeinput": secondInputFilter,
"onFocus": () => emit("update:viewMode", "second")
}, null), props.ampm && createBaseVNode("div", {
"class": "v-time-picker-controls__ampm"
}, [createVNode(VBtn, {
"active": props.period === "am",
"color": props.period === "am" ? props.color : void 0,
"class": normalizeClass({
"v-time-picker-controls__ampm__am": true,
"v-time-picker-controls__ampm__btn": true,
"v-time-picker-controls__ampm__btn__active": props.period === "am"
}),
"disabled": props.disabled,
"text": t("$vuetify.timePicker.am"),
"variant": props.disabled && props.period === "am" ? "elevated" : "tonal",
"onClick": () => props.period !== "am" ? emit("update:period", "am") : null
}, null), createVNode(VBtn, {
"active": props.period === "pm",
"color": props.period === "pm" ? props.color : void 0,
"class": normalizeClass({
"v-time-picker-controls__ampm__pm": true,
"v-time-picker-controls__ampm__btn": true,
"v-time-picker-controls__ampm__btn__active": props.period === "pm"
}),
"disabled": props.disabled,
"text": t("$vuetify.timePicker.pm"),
"variant": props.disabled && props.period === "pm" ? "elevated" : "tonal",
"onClick": () => props.period !== "pm" ? emit("update:period", "pm") : null
}, null)])])]);
});
return {};
}
});
// node_modules/vuetify/lib/components/VTimePicker/VTimePicker.js
var rangeHours24 = createRange(24);
var rangeHours12am = createRange(12);
var rangeHours12pm = rangeHours12am.map((v) => v + 12);
var range60 = createRange(60);
var makeVTimePickerProps = propsFactory({
allowedHours: [Function, Array],
allowedMinutes: [Function, Array],
allowedSeconds: [Function, Array],
disabled: Boolean,
format: {
type: String,
default: "ampm"
},
max: String,
min: String,
viewMode: {
type: String,
default: "hour"
},
period: {
type: String,
default: "am",
validator: (v) => ["am", "pm"].includes(v)
},
modelValue: null,
readonly: Boolean,
scrollable: Boolean,
useSeconds: Boolean,
variant: {
type: String,
default: "dial"
},
...omit(makeVPickerProps({
title: "$vuetify.timePicker.title"
}), ["landscape"]),
...makeDensityProps()
}, "VTimePicker");
var VTimePicker = genericComponent()({
name: "VTimePicker",
props: makeVTimePickerProps(),
emits: {
"update:hour": (val) => true,
"update:minute": (val) => true,
"update:period": (val) => true,
"update:second": (val) => true,
"update:modelValue": (val) => true,
"update:viewMode": (val) => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const {
t
} = useLocale();
const {
densityClasses
} = useDensity(props);
const inputHour = ref(null);
const inputMinute = ref(null);
const inputSecond = ref(null);
const lazyInputHour = ref(null);
const lazyInputMinute = ref(null);
const lazyInputSecond = ref(null);
const period = useProxiedModel(props, "period", "am");
const viewMode = useProxiedModel(props, "viewMode", "hour");
const controlsRef = ref(null);
const clockRef = ref(null);
const isAllowedHourCb = computed(() => {
let cb;
if (props.allowedHours instanceof Array) {
cb = (val) => props.allowedHours.includes(val);
} else {
cb = props.allowedHours;
}
if (!props.min && !props.max) return cb;
const minHour = props.min ? Number(props.min.split(":")[0]) : 0;
const maxHour = props.max ? Number(props.max.split(":")[0]) : 23;
return (val) => {
return val >= Number(minHour) && val <= Number(maxHour) && (!cb || cb(val));
};
});
const isAllowedMinuteCb = computed(() => {
let cb;
const isHourAllowed = !isAllowedHourCb.value || inputHour.value === null || isAllowedHourCb.value(inputHour.value);
if (props.allowedMinutes instanceof Array) {
cb = (val) => props.allowedMinutes.includes(val);
} else {
cb = props.allowedMinutes;
}
if (!props.min && !props.max) {
return isHourAllowed ? cb : () => false;
}
const [minHour, minMinute] = props.min ? props.min.split(":").map(Number) : [0, 0];
const [maxHour, maxMinute] = props.max ? props.max.split(":").map(Number) : [23, 59];
const minTime = minHour * 60 + Number(minMinute);
const maxTime = maxHour * 60 + Number(maxMinute);
return (val) => {
const time = 60 * inputHour.value + val;
return time >= minTime && time <= maxTime && isHourAllowed && (!cb || cb(val));
};
});
const isAllowedSecondCb = computed(() => {
let cb;
const isHourAllowed = !isAllowedHourCb.value || inputHour.value === null || isAllowedHourCb.value(inputHour.value);
const isMinuteAllowed = isHourAllowed && (!isAllowedMinuteCb.value || inputMinute.value === null || isAllowedMinuteCb.value(inputMinute.value));
if (props.allowedSeconds instanceof Array) {
cb = (val) => props.allowedSeconds.includes(val);
} else {
cb = props.allowedSeconds;
}
if (!props.min && !props.max) {
return isMinuteAllowed ? cb : () => false;
}
const [minHour, minMinute, minSecond] = props.min ? props.min.split(":").map(Number) : [0, 0, 0];
const [maxHour, maxMinute, maxSecond] = props.max ? props.max.split(":").map(Number) : [23, 59, 59];
const minTime = minHour * 3600 + minMinute * 60 + Number(minSecond || 0);
const maxTime = maxHour * 3600 + maxMinute * 60 + Number(maxSecond || 0);
return (val) => {
const time = 3600 * inputHour.value + 60 * inputMinute.value + val;
return time >= minTime && time <= maxTime && isMinuteAllowed && (!cb || cb(val));
};
});
const isAmPm = computed(() => {
return props.format === "ampm";
});
const shouldClear = toRef(() => {
return props.modelValue !== null && inputHour.value === null && inputMinute.value === null && (!props.useSeconds || inputSecond.value === null);
});
function emitValue() {
const value = genValue();
if (value !== null && value !== props.modelValue) {
emit("update:modelValue", value);
}
if (shouldClear.value) {
emit("update:modelValue", null);
}
}
watch(inputHour, emitValue);
watch(inputMinute, emitValue);
watch(inputSecond, emitValue);
watch(() => props.period, (val) => setPeriod(val));
watch(() => props.modelValue, (val) => setInputData(val));
watch(() => props.useSeconds, (val, old) => {
if (old && !val && viewMode.value === "second") {
viewMode.value = "minute";
}
if (!val && inputSecond.value !== null) {
inputSecond.value = null;
}
});
onMounted(() => {
setInputData(props.modelValue);
});
function genValue() {
if (inputHour.value != null && inputMinute.value != null && (!props.useSeconds || inputSecond.value != null)) {
return `${pad(inputHour.value)}:${pad(inputMinute.value)}` + (props.useSeconds ? `:${pad(inputSecond.value)}` : "");
}
return null;
}
function setInputData(value) {
if (value == null || value === "") {
inputHour.value = null;
inputMinute.value = null;
inputSecond.value = null;
} else if (value instanceof Date) {
inputHour.value = value.getHours();
inputMinute.value = value.getMinutes();
inputSecond.value = value.getSeconds();
} else {
const [hour, , minute, , second, period2] = value.trim().toLowerCase().match(/^(\d+):(\d+)(:(\d+))?([ap]m)?$/) || new Array(6);
inputHour.value = period2 ? convert12to24(parseInt(hour, 10), period2) : parseInt(hour, 10);
inputMinute.value = parseInt(minute, 10);
inputSecond.value = parseInt(second || 0, 10);
}
period.value = inputHour.value == null || inputHour.value < 12 ? "am" : "pm";
}
function firstAllowed(type, value) {
const allowedFn = type === "hour" ? isAllowedHourCb.value : type === "minute" ? isAllowedMinuteCb.value : isAllowedSecondCb.value;
if (!allowedFn) return value;
const range = type === "minute" ? range60 : type === "second" ? range60 : isAmPm.value ? value < 12 ? rangeHours12am : rangeHours12pm : rangeHours24;
const first = range.find((v) => allowedFn((v + value) % range.length + range[0]));
return ((first || 0) + value) % range.length + range[0];
}
function setPeriod(val) {
period.value = val;
if (inputHour.value != null) {
const newHour = inputHour.value + (period.value === "am" ? -12 : 12);
inputHour.value = firstAllowed("hour", newHour);
}
emit("update:period", val);
emitValue();
return true;
}
function onInput(value) {
if (viewMode.value === "hour") {
inputHour.value = isAmPm.value ? convert12to24(value, period.value) : value;
} else if (viewMode.value === "minute") {
inputMinute.value = value;
} else {
inputSecond.value = value;
}
}
function onChange(value) {
switch (viewMode.value || "hour") {
case "hour":
emit("update:hour", value);
break;
case "minute":
emit("update:minute", value);
break;
case "second":
emit("update:second", value);
break;
default:
break;
}
const emitChange = inputHour.value !== null && inputMinute.value !== null && (props.useSeconds ? inputSecond.value !== null : true);
if (viewMode.value === "hour") {
viewMode.value = "minute";
} else if (props.useSeconds && viewMode.value === "minute") {
viewMode.value = "second";
}
if (inputHour.value === lazyInputHour.value && inputMinute.value === lazyInputMinute.value && (!props.useSeconds || inputSecond.value === lazyInputSecond.value)) return;
const time = genValue();
if (time === null) return;
lazyInputHour.value = inputHour.value;
lazyInputMinute.value = inputMinute.value;
props.useSeconds && (lazyInputSecond.value = inputSecond.value);
emitChange && emitValue();
}
useRender(() => {
const pickerProps = omit(VPicker.filterProps(props), ["hideHeader"]);
const timePickerControlsProps = VTimePickerControls.filterProps(props);
const timePickerClockProps = VTimePickerClock.filterProps(omit(props, ["format", "modelValue", "min", "max"]));
return createVNode(VPicker, mergeProps(pickerProps, {
"color": void 0,
"class": ["v-time-picker", `v-time-picker--variant-${props.variant}`, props.class, densityClasses.value],
"hideHeader": props.hideHeader && props.variant !== "input",
"style": props.style
}), {
title: () => slots.title?.() ?? createBaseVNode("div", {
"class": "v-time-picker__title"
}, [t(props.title)]),
header: () => createVNode(VTimePickerControls, mergeProps(timePickerControlsProps, {
"ampm": isAmPm.value,
"hour": inputHour.value,
"minute": inputMinute.value,
"period": period.value,
"second": inputSecond.value,
"viewMode": viewMode.value,
"onUpdate:hour": (val) => inputHour.value = val,
"onUpdate:minute": (val) => inputMinute.value = val,
"onUpdate:period": (val) => setPeriod(val),
"onUpdate:second": (val) => inputSecond.value = val,
"onUpdate:viewMode": (value) => viewMode.value = value,
"ref": controlsRef
}), null),
default: () => createVNode(VTimePickerClock, mergeProps(timePickerClockProps, {
"allowedValues": viewMode.value === "hour" ? isAllowedHourCb.value : viewMode.value === "minute" ? isAllowedMinuteCb.value : isAllowedSecondCb.value,
"double": viewMode.value === "hour" && !isAmPm.value,
"format": viewMode.value === "hour" ? isAmPm.value ? convert24to12 : (val) => val : (val) => pad(val, 2),
"max": viewMode.value === "hour" ? isAmPm.value && period.value === "am" ? 11 : 23 : 59,
"min": viewMode.value === "hour" && isAmPm.value && period.value === "pm" ? 12 : 0,
"size": 20,
"step": viewMode.value === "hour" ? 1 : 5,
"modelValue": viewMode.value === "hour" ? inputHour.value : viewMode.value === "minute" ? inputMinute.value : inputSecond.value,
"onChange": onChange,
"onInput": onInput,
"ref": clockRef
}), null),
actions: slots.actions
});
});
}
});
// node_modules/vuetify/lib/components/VTreeview/VTreeviewGroup.js
var makeVTreeviewGroupProps = propsFactory({
...omit(makeVListGroupProps({
collapseIcon: "$treeviewCollapse",
expandIcon: "$treeviewExpand"
}), ["subgroup"])
}, "VTreeviewGroup");
var VTreeviewGroup = genericComponent()({
name: "VTreeviewGroup",
props: makeVTreeviewGroupProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const vListGroupRef = ref();
const toggleIcon = computed(() => vListGroupRef.value?.isOpen ? props.collapseIcon : props.expandIcon);
const activatorDefaults = computed(() => ({
VTreeviewItem: {
prependIcon: void 0,
appendIcon: void 0,
toggleIcon: toggleIcon.value
}
}));
useRender(() => {
const listGroupProps = VListGroup.filterProps(props);
return createVNode(VListGroup, mergeProps(listGroupProps, {
"ref": vListGroupRef,
"class": ["v-treeview-group", props.class],
"subgroup": true
}), {
...slots,
activator: slots.activator ? (slotProps) => createBaseVNode(Fragment, null, [createVNode(VDefaultsProvider, {
"defaults": activatorDefaults.value
}, {
default: () => [slots.activator?.(slotProps)]
})]) : void 0
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VTreeview/VTreeviewItem.js
import "/home/david/gitea_repo/personal_development/ServerManagerWebApp/frontend/node_modules/vuetify/lib/components/VTreeview/VTreeviewItem.css";
// node_modules/vuetify/lib/components/VTreeview/shared.js
var VTreeviewSymbol = /* @__PURE__ */ Symbol.for("vuetify:v-treeview");
// node_modules/vuetify/lib/components/VTreeview/VTreeviewItem.js
var makeVTreeviewItemProps = propsFactory({
loading: Boolean,
hideActions: Boolean,
hasCustomPrepend: Boolean,
indentLines: Array,
toggleIcon: IconValue,
...makeVListItemProps({
slim: true
})
}, "VTreeviewItem");
var VTreeviewItem = genericComponent()({
name: "VTreeviewItem",
props: makeVTreeviewItemProps(),
emits: {
toggleExpand: (value) => true
},
setup(props, _ref) {
let {
slots,
emit
} = _ref;
const visibleIds = inject(VTreeviewSymbol, {
visibleIds: ref()
}).visibleIds;
const vListItemRef = ref();
const isActivatableGroupActivator = computed(() => vListItemRef.value?.root.activatable.value && vListItemRef.value?.isGroupActivator);
const vListItemRefIsClickable = computed(() => vListItemRef.value?.link.isClickable.value || props.value != null && !!vListItemRef.value?.list);
const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || vListItemRefIsClickable.value || isActivatableGroupActivator.value));
const isFiltered = computed(() => visibleIds.value && !visibleIds.value.has(toRaw(vListItemRef.value?.id)));
function activateGroupActivator(e) {
if (isClickable.value && isActivatableGroupActivator.value) {
vListItemRef.value?.activate(!vListItemRef.value?.isActivated, e);
}
}
function onClickAction(e) {
e.preventDefault();
e.stopPropagation();
emit("toggleExpand", e);
}
useRender(() => {
const listItemProps = VListItem.filterProps(props);
const hasPrepend = slots.prepend || props.toggleIcon || props.indentLines || props.prependIcon || props.prependAvatar;
return createVNode(VListItem, mergeProps({
"ref": vListItemRef
}, listItemProps, {
"active": vListItemRef.value?.isActivated || void 0,
"class": ["v-treeview-item", {
"v-treeview-item--activatable-group-activator": isActivatableGroupActivator.value,
"v-treeview-item--filtered": isFiltered.value
}, props.class],
"ripple": false,
"onClick": activateGroupActivator
}), {
...slots,
prepend: hasPrepend ? (slotProps) => {
return createBaseVNode(Fragment, null, [props.indentLines && props.indentLines.length > 0 ? createBaseVNode("div", {
"key": "indent-lines",
"class": "v-treeview-indent-lines",
"style": {
"--v-indent-parts": props.indentLines.length
}
}, [props.indentLines.map((type) => createBaseVNode("div", {
"class": normalizeClass(`v-treeview-indent-line v-treeview-indent-line--${type}`)
}, null))]) : "", !props.hideActions && createVNode(VListItemAction, {
"start": true
}, {
default: () => [props.toggleIcon ? createBaseVNode(Fragment, null, [!slots.toggle ? createVNode(VBtn, {
"key": "prepend-toggle",
"density": "compact",
"icon": props.toggleIcon,
"loading": props.loading,
"variant": "text",
"onClick": onClickAction
}, {
loader: () => createVNode(VProgressCircular, {
"indeterminate": "disable-shrink",
"size": "20",
"width": "2"
}, null)
}) : createVNode(VDefaultsProvider, {
"key": "prepend-defaults",
"defaults": {
VBtn: {
density: "compact",
icon: props.toggleIcon,
variant: "text",
loading: props.loading
},
VProgressCircular: {
indeterminate: "disable-shrink",
size: 20,
width: 2
}
}
}, {
default: () => [slots.toggle({
...slotProps,
loading: props.loading,
props: {
onClick: onClickAction
}
})]
})]) : createBaseVNode("div", {
"class": "v-treeview-item__level"
}, null)]
}), !props.hasCustomPrepend ? createBaseVNode(Fragment, null, [slots.prepend?.(slotProps), props.prependAvatar && createVNode(VAvatar, {
"key": "prepend-avatar",
"density": props.density,
"image": props.prependAvatar
}, null), props.prependIcon && createVNode(VIcon, {
"key": "prepend-icon",
"density": props.density,
"icon": props.prependIcon
}, null)]) : createVNode(VDefaultsProvider, {
"key": "prepend-defaults",
"defaults": {
VAvatar: {
density: props.density,
image: props.appendAvatar
},
VIcon: {
density: props.density,
icon: props.appendIcon
},
VListItemAction: {
start: true
}
}
}, {
default: () => [slots.prepend?.(slotProps)]
})]);
} : void 0
});
});
return forwardRefs({}, vListItemRef);
}
});
// node_modules/vuetify/lib/components/VTreeview/VTreeviewChildren.js
var makeVTreeviewChildrenProps = propsFactory({
fluid: Boolean,
disabled: Boolean,
loadChildren: Function,
loadingIcon: {
type: String,
default: "$loading"
},
items: Array,
openOnClick: {
type: Boolean,
default: void 0
},
indeterminateIcon: {
type: IconValue,
default: "$checkboxIndeterminate"
},
falseIcon: IconValue,
trueIcon: IconValue,
returnObject: Boolean,
activatable: Boolean,
selectable: Boolean,
selectedColor: String,
selectStrategy: [String, Function, Object],
index: Number,
isLastGroup: Boolean,
separateRoots: Boolean,
parentIndentLines: Array,
indentLinesVariant: String,
path: {
type: Array,
default: () => []
},
...pick(makeVTreeviewItemProps(), ["hideActions"]),
...makeDensityProps()
}, "VTreeviewChildren");
var VTreeviewChildren = genericComponent()({
name: "VTreeviewChildren",
props: makeVTreeviewChildrenProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const isLoading = reactive(/* @__PURE__ */ new Set());
const activatorItems = ref([]);
const isClickOnOpen = computed(() => !props.disabled && (props.openOnClick != null ? props.openOnClick : props.selectable && !props.activatable));
async function checkChildren(item) {
try {
if (!props.items?.length || !props.loadChildren) return;
if (item?.children?.length === 0) {
isLoading.add(item.value);
await props.loadChildren(item.raw);
}
} finally {
isLoading.delete(item.value);
}
}
function selectItem(select, isSelected) {
if (props.selectable) {
select(isSelected);
}
}
return () => slots.default?.() ?? props.items?.map((item, index, items) => {
const {
children,
props: itemProps
} = item;
const loading = isLoading.has(item.value);
const nextItemHasChildren = !!items.at(index + 1)?.children;
const depth = props.path?.length ?? 0;
const isLast = items.length - 1 === index;
const treeItemProps = {
index,
depth,
isFirst: index === 0,
isLast,
path: [...props.path, index],
hideAction: props.hideActions
};
const indentLines = getIndentLines({
depth,
isLast,
isLastGroup: props.isLastGroup,
leafLinks: !props.hideActions && !props.fluid,
separateRoots: props.separateRoots,
parentIndentLines: props.parentIndentLines,
variant: props.indentLinesVariant
});
const slotsWithItem = {
toggle: slots.toggle ? (slotProps) => slots.toggle?.({
...slotProps,
...treeItemProps,
item: item.raw,
internalItem: item,
loading
}) : void 0,
prepend: (slotProps) => createBaseVNode(Fragment, null, [props.selectable && (!children || children && !["leaf", "single-leaf"].includes(props.selectStrategy)) && createVNode(VListItemAction, {
"start": true
}, {
default: () => [createVNode(VCheckboxBtn, {
"key": item.value,
"modelValue": slotProps.isSelected,
"disabled": props.disabled || itemProps.disabled,
"loading": loading,
"color": props.selectedColor,
"density": props.density,
"indeterminate": slotProps.isIndeterminate,
"indeterminateIcon": props.indeterminateIcon,
"falseIcon": props.falseIcon,
"trueIcon": props.trueIcon,
"onUpdate:modelValue": (v) => selectItem(slotProps.select, v),
"onClick": (e) => e.stopPropagation(),
"onKeydown": (e) => {
if (!["Enter", "Space"].includes(e.key)) return;
e.stopPropagation();
selectItem(slotProps.select, slotProps.isSelected);
}
}, null)]
}), slots.prepend?.({
...slotProps,
...treeItemProps,
item: item.raw,
internalItem: item
})]),
append: slots.append ? (slotProps) => slots.append?.({
...slotProps,
...treeItemProps,
item: item.raw,
internalItem: item
}) : void 0,
title: slots.title ? (slotProps) => slots.title?.({
...slotProps,
item: item.raw,
internalItem: item
}) : void 0,
subtitle: slots.subtitle ? (slotProps) => slots.subtitle?.({
...slotProps,
item: item.raw,
internalItem: item
}) : void 0
};
const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
const treeviewChildrenProps = VTreeviewChildren.filterProps({
...props,
...treeItemProps
});
const footerProps = {
hideActions: props.hideActions,
indentLines: indentLines.footer
};
return children ? createVNode(VTreeviewGroup, mergeProps(treeviewGroupProps, {
"value": props.returnObject ? item.raw : treeviewGroupProps?.value,
"rawId": treeviewGroupProps?.value
}), {
activator: (_ref2) => {
let {
props: activatorProps
} = _ref2;
const listItemProps = {
...itemProps,
...activatorProps,
value: itemProps?.value,
hideActions: props.hideActions,
indentLines: indentLines.node,
onToggleExpand: [() => checkChildren(item), activatorProps.onClick],
onClick: props.disabled || itemProps.disabled ? void 0 : isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : () => selectItem(activatorItems.value[index]?.select, !activatorItems.value[index]?.isSelected)
};
return renderSlot(slots.header, {
props: listItemProps,
item: item.raw,
internalItem: item,
loading
}, () => createVNode(VTreeviewItem, mergeProps({
"ref": (el) => activatorItems.value[index] = el
}, listItemProps, {
"hasCustomPrepend": !!slots.prepend,
"value": props.returnObject ? item.raw : itemProps.value,
"loading": loading
}), slotsWithItem));
},
default: () => createBaseVNode(Fragment, null, [createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
"items": children,
"indentLinesVariant": props.indentLinesVariant,
"parentIndentLines": indentLines.children,
"isLastGroup": nextItemHasChildren,
"returnObject": props.returnObject
}), slots), slots.footer?.({
props: footerProps,
item: item.raw,
internalItem: item,
loading
})])
}) : renderSlot(slots.item, {
props: itemProps,
item: item.raw,
internalItem: item
}, () => {
if (item.type === "divider") {
return renderSlot(slots.divider, {
props: item.raw
}, () => createVNode(VDivider, item.props, null));
}
if (item.type === "subheader") {
return renderSlot(slots.subheader, {
props: item.raw
}, () => createVNode(VListSubheader, item.props, null));
}
return createVNode(VTreeviewItem, mergeProps(itemProps, {
"hasCustomPrepend": !!slots.prepend,
"hideActions": props.hideActions,
"indentLines": indentLines.leaf,
"value": props.returnObject ? toRaw(item.raw) : itemProps.value
}), slotsWithItem);
});
});
}
});
// node_modules/vuetify/lib/components/VTreeview/VTreeview.js
function flatten(items) {
let flat = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
for (const item of items) {
flat.push(item);
if (item.children) flatten(item.children, flat);
}
return flat;
}
var makeVTreeviewProps = propsFactory({
openAll: Boolean,
indentLines: [Boolean, String],
search: String,
hideNoData: Boolean,
noDataText: {
type: String,
default: "$vuetify.noDataText"
},
...makeFilterProps({
filterKeys: ["title"]
}),
...omit(makeVTreeviewChildrenProps(), ["index", "path", "indentLinesVariant", "parentIndentLines", "isLastGroup"]),
...omit(makeVListProps({
collapseIcon: "$treeviewCollapse",
expandIcon: "$treeviewExpand",
slim: true
}), ["nav", "openStrategy"]),
modelValue: Array
}, "VTreeview");
var VTreeview = genericComponent()({
name: "VTreeview",
props: makeVTreeviewProps(),
emits: {
"update:opened": (val) => true,
"update:activated": (val) => true,
"update:selected": (val) => true,
"update:modelValue": (val) => true,
"click:open": (value) => true,
"click:select": (value) => true
},
setup(props, _ref) {
let {
slots,
emit
} = _ref;
const {
t
} = useLocale();
const {
items
} = useListItems(props);
const activeColor = toRef(() => props.activeColor);
const baseColor = toRef(() => props.baseColor);
const color = toRef(() => props.color);
const activated = useProxiedModel(props, "activated");
const _selected = useProxiedModel(props, "selected");
const selected = computed({
get: () => props.modelValue ?? _selected.value,
set(val) {
_selected.value = val;
emit("update:modelValue", val);
}
});
const vListRef = ref();
const opened = computed(() => props.openAll ? openAll(items.value) : props.opened);
const flatItems = computed(() => flatten(items.value));
const search = toRef(() => props.search);
const {
filteredItems
} = useFilter(props, flatItems, search);
const visibleIds = computed(() => {
if (!search.value) return null;
const getPath = vListRef.value?.getPath;
if (!getPath) return null;
return new Set(filteredItems.value.flatMap((item) => {
const itemVal = props.returnObject ? item.raw : item.props.value;
return [...getPath(itemVal), ...getChildren(itemVal)].map(toRaw);
}));
});
function getChildren(id) {
const arr = [];
const queue = (vListRef.value?.children.get(id) ?? []).slice();
while (queue.length) {
const child = queue.shift();
if (!child) continue;
arr.push(child);
queue.push(...(vListRef.value?.children.get(child) ?? []).slice());
}
return arr;
}
function openAll(items2) {
let ids = [];
for (const i of items2) {
if (!i.children) continue;
ids.push(props.returnObject ? toRaw(i.raw) : i.value);
if (i.children) {
ids = ids.concat(openAll(i.children));
}
}
return ids;
}
provide(VTreeviewSymbol, {
visibleIds
});
provideDefaults({
VTreeviewGroup: {
activeColor,
baseColor,
color,
collapseIcon: toRef(() => props.collapseIcon),
expandIcon: toRef(() => props.expandIcon)
},
VTreeviewItem: {
activeClass: toRef(() => props.activeClass),
activeColor,
baseColor,
color,
density: toRef(() => props.density),
disabled: toRef(() => props.disabled),
lines: toRef(() => props.lines),
variant: toRef(() => props.variant)
}
});
useRender(() => {
const listProps = VList.filterProps(props);
const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
const indentLinesVariant = typeof props.indentLines === "boolean" ? "default" : props.indentLines;
return createVNode(VList, mergeProps({
"ref": vListRef
}, listProps, {
"class": ["v-treeview", {
"v-treeview--fluid": props.fluid
}, props.class],
"openStrategy": "multiple",
"style": props.style,
"opened": opened.value,
"activated": activated.value,
"onUpdate:activated": ($event) => activated.value = $event,
"selected": selected.value,
"onUpdate:selected": ($event) => selected.value = $event
}), {
default: () => [visibleIds.value?.size === 0 && !props.hideNoData && (slots["no-data"]?.() ?? createVNode(VListItem, {
"key": "no-data",
"title": t(props.noDataText)
}, null)), createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
"density": props.density,
"returnObject": props.returnObject,
"items": items.value,
"parentIndentLines": props.indentLines ? [] : void 0,
"indentLinesVariant": indentLinesVariant
}), slots)]
});
});
return {};
}
});
// node_modules/vuetify/lib/components/VValidation/VValidation.js
var VValidation = genericComponent()({
name: "VValidation",
props: makeValidationProps(),
emits: {
"update:modelValue": (value) => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const validation = useValidation(props, "validation");
return () => slots.default?.(validation);
}
});
export {
VAlert,
VAlertTitle,
VApp,
VAppBar,
VAppBarNavIcon,
VAppBarTitle,
VAutocomplete,
VAvatar,
VBadge,
VBanner,
VBannerActions,
VBannerText,
VBottomNavigation,
VBottomSheet,
VBreadcrumbs,
VBreadcrumbsDivider,
VBreadcrumbsItem,
VBtn,
VBtnGroup,
VBtnToggle,
VCalendar,
VCard,
VCardActions,
VCardItem,
VCardSubtitle,
VCardText,
VCardTitle,
VCarousel,
VCarouselItem,
VCheckbox,
VCheckboxBtn,
VChip,
VChipGroup,
VClassIcon,
VCode,
VCol,
VColorPicker,
VCombobox,
VComponentIcon,
VConfirmEdit,
VContainer,
VCounter,
VDataIterator,
VDataTable,
VDataTableFooter,
VDataTableHeaders,
VDataTableRow,
VDataTableRows,
VDataTableServer,
VDataTableVirtual,
VDatePicker,
VDatePickerControls,
VDatePickerHeader,
VDatePickerMonth,
VDatePickerMonths,
VDatePickerYears,
VDefaultsProvider,
VDialog,
VDialogBottomTransition,
VDialogTopTransition,
VDialogTransition,
VDivider,
VEmptyState,
VExpandTransition,
VExpandXTransition,
VExpansionPanel,
VExpansionPanelText,
VExpansionPanelTitle,
VExpansionPanels,
VFab,
VFabTransition,
VFadeTransition,
VField,
VFieldLabel,
VFileInput,
VFooter,
VForm,
VHotkey,
VHover,
VIcon,
VImg,
VInfiniteScroll,
VInput,
VItem,
VItemGroup,
VKbd,
VLabel,
VLayout,
VLayoutItem,
VLazy,
VLigatureIcon,
VList,
VListGroup,
VListImg,
VListItem,
VListItemAction,
VListItemMedia,
VListItemSubtitle,
VListItemTitle,
VListSubheader,
VLocaleProvider,
VMain,
VMenu,
VMessages,
VNavigationDrawer,
VNoSsr,
VNumberInput,
VOtpInput,
VOverlay,
VPagination,
VParallax,
VProgressCircular,
VProgressLinear,
VRadio,
VRadioGroup,
VRangeSlider,
VRating,
VResponsive,
VRow,
VScaleTransition,
VScrollXReverseTransition,
VScrollXTransition,
VScrollYReverseTransition,
VScrollYTransition,
VSelect,
VSelectionControl,
VSelectionControlGroup,
VSheet,
VSkeletonLoader,
VSlideGroup,
VSlideGroupItem,
VSlideXReverseTransition,
VSlideXTransition,
VSlideYReverseTransition,
VSlideYTransition,
VSlider,
VSnackbar,
VSnackbarQueue,
VSpacer,
VSparkline,
VSpeedDial,
VStepper,
VStepperActions,
VStepperHeader,
VStepperItem,
VStepperWindow,
VStepperWindowItem,
VSvgIcon,
VSwitch,
VSystemBar,
VTab,
VTable,
VTabs,
VTabsWindow,
VTabsWindowItem,
VTextField,
VTextarea,
VThemeProvider,
VTimePicker,
VTimePickerClock,
VTimePickerControls,
VTimeline,
VTimelineItem,
VToolbar,
VToolbarItems,
VToolbarTitle,
VTooltip,
VTreeview,
VTreeviewGroup,
VTreeviewItem,
VValidation,
VVirtualScroll,
VWindow,
VWindowItem
};
//# sourceMappingURL=vuetify_components.js.map