{"version":3,"file":"useRangeCalendar.cjs","sources":["../../src/RangeCalendar/useRangeCalendar.ts"],"sourcesContent":["/*\n * Adapted from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/range-calendar/create.ts\n*/\n\nimport type { DateValue } from '@internationalized/date'\nimport type { Ref } from 'vue'\nimport type { Matcher } from '@/date'\nimport { isSameDay } from '@internationalized/date'\nimport { computed } from 'vue'\nimport { areAllDaysBetweenValid, isBefore, isBetween } from '@/date'\n\nexport type UseRangeCalendarProps = {\n start: Ref\n end: Ref\n isDateDisabled: Matcher\n isDateUnavailable: Matcher\n isDateHighlightable?: Matcher\n focusedValue: Ref\n allowNonContiguousRanges: Ref\n fixedDate: Ref<'start' | 'end' | undefined>\n maximumDays?: Ref\n}\n\nexport function useRangeCalendarState(props: UseRangeCalendarProps) {\n const isStartInvalid = computed(() => {\n if (!props.start.value)\n return false\n if (props.isDateDisabled(props.start.value))\n return true\n return false\n })\n\n const isEndInvalid = computed(() => {\n if (!props.end.value)\n return false\n if (props.isDateDisabled(props.end.value))\n return true\n return false\n })\n\n const isInvalid = computed(\n () => {\n if (isStartInvalid.value || isEndInvalid.value)\n return false\n if (props.start.value && props.end.value && isBefore(props.end.value, props.start.value))\n return true\n return false\n },\n )\n\n const isSelectionStart = (date: DateValue) => {\n if (!props.start.value)\n return false\n return isSameDay(props.start.value, date)\n }\n\n const isSelectionEnd = (date: DateValue) => {\n if (!props.end.value)\n return false\n return isSameDay(props.end.value, date)\n }\n\n const isSelected = (date: DateValue) => {\n if (props.start.value && isSameDay(props.start.value, date))\n return true\n if (props.end.value && isSameDay(props.end.value, date))\n return true\n if (props.end.value && props.start.value)\n return isBetween(date, props.start.value, props.end.value)\n\n return false\n }\n\n // Check if a date exceeds maximum days limit from the start date\n const rangeIsDateDisabled = (date: DateValue) => {\n if (props.isDateDisabled(date))\n return true\n\n if (!props.maximumDays?.value || !props.start.value || props.end.value || isSameDay(props.start.value, date))\n return false\n\n // Check if exceeds maximum days limit\n if (Math.abs(date.compare(props.start.value)) > props.maximumDays.value)\n return true\n\n return false\n }\n\n const isDateHighlightable = (date: DateValue) => {\n if (props.isDateHighlightable?.(date))\n return true\n return false\n }\n\n const highlightedRange = computed(() => {\n if (props.start.value && props.end.value && !props.fixedDate.value)\n return null\n if (!props.start.value || !props.focusedValue.value)\n return null\n\n const isStartBeforeFocused = isBefore(props.start.value, props.focusedValue.value)\n const start = isStartBeforeFocused ? props.start.value : props.focusedValue.value\n const end = isStartBeforeFocused ? props.focusedValue.value : props.start.value\n\n if (isSameDay(start, end)) {\n return {\n start,\n end,\n }\n }\n\n // If maximum days is set and the range exceeds it, limit the highlight\n // We only apply this when we're in the middle of a selection (no end date yet)\n if (props.maximumDays?.value && !props.end.value && Math.abs(end.compare(start)) > props.maximumDays.value) {\n // Determine the direction of selection and limit to maximum days\n const cappedEnd = isStartBeforeFocused\n ? start.add({ days: props.maximumDays.value })\n : start.subtract({ days: props.maximumDays.value })\n\n return {\n start,\n end: cappedEnd,\n }\n }\n\n const isValid = areAllDaysBetweenValid(start, end, props.allowNonContiguousRanges.value ? () => false : props.isDateUnavailable, rangeIsDateDisabled, props.isDateHighlightable)\n if (isValid) {\n return {\n start,\n end,\n }\n }\n return null\n })\n\n const isHighlightedStart = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.start)\n return false\n return isSameDay(highlightedRange.value.start, date)\n }\n\n const isHighlightedEnd = (date: DateValue) => {\n if (!highlightedRange.value || !highlightedRange.value.end)\n return false\n return isSameDay(highlightedRange.value.end, date)\n }\n\n return {\n isInvalid,\n isSelected,\n isDateHighlightable,\n highlightedRange,\n isSelectionStart,\n isSelectionEnd,\n isHighlightedStart,\n isHighlightedEnd,\n isDateDisabled: rangeIsDateDisabled,\n }\n}\n"],"names":["computed","isBefore","date","isSameDay","isBetween","areAllDaysBetweenValid"],"mappings":"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"}