@calchemy/date-react 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/calendar/CalendarGrid.d.ts.map +1 -1
- package/dist/components/calendar/CalendarGrid.js +9 -27
- package/dist/components/calendar/CalendarGrid.js.map +1 -1
- package/dist/components/calendar/CalendarPeriod.d.ts.map +1 -1
- package/dist/components/calendar/CalendarPeriod.js +9 -27
- package/dist/components/calendar/CalendarPeriod.js.map +1 -1
- package/dist/components/calendar/CalendarPeriodList.d.ts.map +1 -1
- package/dist/components/calendar/CalendarPeriodList.js +9 -27
- package/dist/components/calendar/CalendarPeriodList.js.map +1 -1
- package/dist/components/calendar/calendar-period-drag.d.ts +3 -1
- package/dist/components/calendar/calendar-period-drag.d.ts.map +1 -1
- package/dist/components/calendar/calendar-period-drag.js +29 -0
- package/dist/components/calendar/calendar-period-drag.js.map +1 -1
- package/dist/components/calendar/date-model.d.ts +0 -1
- package/dist/components/calendar/date-model.d.ts.map +1 -1
- package/dist/components/calendar/date-model.js +1 -1
- package/dist/components/calendar/date-model.js.map +1 -1
- package/dist/index.cjs +52 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +52 -60
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useCalchemy.ts","../src/inline-completion.ts","../src/hooks/useDebouncedValue.ts","../src/components/calendar/Calendar.tsx","../src/components/calendar/CalendarGrid.tsx","../src/components/calendar/calendar-period-drag.tsx","../src/components/calendar/date-model.ts","../src/components/calendar/CalendarPeriodHeading.tsx","../src/components/calendar/CalendarPeriod.tsx","../src/components/calendar/CalendarPeriodList.tsx","../src/components/calendar/CalendarSelects.tsx","../src/components/Calchemy.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { resolveExpectedDateValue } from \"@calchemy/date-core\";\nimport {\n composeInlineCompletion,\n formatInlineCompletionDescription,\n} from \"../inline-completion\";\nimport { useDebouncedValue } from \"./useDebouncedValue\";\nimport type {\n Calchemy,\n DateValue,\n ExpectedDateValue,\n ParseDateContext,\n ParseDateResult,\n ResolveExpectedDateValueOptions,\n} from \"@calchemy/date-core\";\n\nexport type CalchemyInputMode = \"field\" | \"calendar\";\n\nexport type UseCalchemyOptions = ResolveExpectedDateValueOptions & {\n calchemy: Calchemy;\n expectedValue: ExpectedDateValue;\n value?: DateValue | null;\n defaultValue?: DateValue | null;\n onValueChange?: (value: DateValue | null, result: ParseDateResult) => void;\n parseContext?: ParseDateContext;\n inputValue?: string;\n defaultInputValue?: string;\n onInputValueChange?: (value: string) => void;\n inputMode?: CalchemyInputMode;\n defaultInputMode?: CalchemyInputMode;\n onInputModeChange?: (mode: CalchemyInputMode) => void;\n};\n\nexport type CalchemyState = {\n calchemy: Calchemy;\n parseContext: ParseDateContext | undefined;\n inputValue: string;\n value: DateValue | null;\n result: ParseDateResult;\n expectedValue: ExpectedDateValue;\n inputMode: CalchemyInputMode;\n valueKindMismatch: boolean;\n inlineCompletion: ReturnType<Calchemy[\"getInlineCompletion\"]>;\n setInputValue(value: string): void;\n setInputMode(mode: CalchemyInputMode): void;\n acceptCompletion(): void;\n selectCandidate(candidateId: string): void;\n selectDate(value: DateValue): void;\n getInputProps(): {\n value: string;\n readOnly: boolean;\n onChange(event: { currentTarget: { value: string } }): void;\n onKeyDown(event: { key: string; preventDefault(): void }): void;\n \"aria-invalid\": boolean;\n \"aria-description\"?: string;\n \"calchemy-status\": ParseDateResult[\"status\"] | \"kind-mismatch\";\n \"calchemy-expected-value\": ExpectedDateValue | undefined;\n \"calchemy-value-kind\": ExpectedDateValue | undefined;\n };\n};\n\nexport function useCalchemy(options: UseCalchemyOptions): CalchemyState {\n const [uncontrolledInputValue, setUncontrolledInputValue] = useState(options.defaultInputValue ?? \"\");\n const [uncontrolledValue, setUncontrolledValue] = useState<DateValue | null>(options.defaultValue ?? null);\n const [uncontrolledInputMode, setUncontrolledInputMode] = useState<CalchemyInputMode>(\n options.defaultInputMode ?? \"field\",\n );\n const inputValue = options.inputValue ?? uncontrolledInputValue;\n const value = options.value ?? uncontrolledValue;\n const inputMode = options.inputMode ?? uncontrolledInputMode;\n const fieldInputActive = inputMode === \"field\";\n const queryValue = useDebouncedValue(inputValue);\n const queryPending = inputValue !== queryValue;\n const result = useMemo(\n () => options.calchemy.parseDate(queryValue, options.parseContext),\n [queryValue, options.calchemy, options.parseContext],\n );\n const expectedValue = options.expectedValue;\n const expectedOptions = {\n ...(options.multipleRangeExpansionLimit === undefined\n ? {}\n : { multipleRangeExpansionLimit: options.multipleRangeExpansionLimit }),\n } satisfies ResolveExpectedDateValueOptions;\n const expectedResult = resolveExpectedDateValue(result, expectedValue, expectedOptions);\n const valueKindMismatch = expectedResult.status === \"invalid\" && result.status === \"valid\";\n const settledInlineCompletion = useMemo(\n () => options.calchemy.getInlineCompletion(queryValue, options.parseContext),\n [queryValue, options.calchemy, options.parseContext],\n );\n const inlineCompletion = queryPending ? null : settledInlineCompletion;\n\n function updateValue(nextValue: DateValue | null, nextResult: ParseDateResult = result) {\n if (options.value === undefined) {\n setUncontrolledValue(nextValue);\n }\n options.onValueChange?.(nextValue, nextResult);\n }\n\n useEffect(() => {\n const nextResult = options.calchemy.parseDate(queryValue, options.parseContext);\n const nextExpectedResult = resolveExpectedDateValue(\n nextResult,\n expectedValue,\n expectedOptions,\n );\n if (nextExpectedResult.status === \"valid\") {\n if (options.value === undefined) {\n setUncontrolledValue(nextExpectedResult.value);\n }\n options.onValueChange?.(nextExpectedResult.value, nextExpectedResult);\n }\n }, [\n queryValue,\n expectedValue,\n expectedOptions.multipleRangeExpansionLimit,\n options.calchemy,\n options.parseContext,\n ]);\n\n function updateInputValue(nextValue: string) {\n if (options.inputValue === undefined) {\n setUncontrolledInputValue(nextValue);\n }\n options.onInputValueChange?.(nextValue);\n }\n\n function getActiveInlineCompletion() {\n if (!fieldInputActive || queryPending) {\n return null;\n }\n\n return settledInlineCompletion;\n }\n\n function setInputMode(nextMode: CalchemyInputMode) {\n if (options.inputMode === undefined) {\n setUncontrolledInputMode(nextMode);\n }\n options.onInputModeChange?.(nextMode);\n }\n\n function acceptCompletion() {\n const activeCompletion = getActiveInlineCompletion();\n if (!activeCompletion) {\n return;\n }\n\n updateInputValue(composeInlineCompletion(inputValue, activeCompletion));\n }\n\n function selectCandidate(candidateId: string) {\n if (!fieldInputActive || result.status !== \"ambiguous\") {\n return;\n }\n\n const candidate = result.candidates.find((item) => item.id === candidateId);\n if (!candidate) {\n return;\n }\n\n const candidateResult = {\n status: \"valid\",\n input: inputValue,\n value: candidate.value,\n candidates: [candidate],\n corrections: result.corrections,\n warnings: result.warnings,\n } satisfies ParseDateResult;\n const resolvedCandidateResult = resolveExpectedDateValue(candidateResult, expectedValue, expectedOptions);\n if (resolvedCandidateResult.status !== \"valid\") {\n return;\n }\n\n updateValue(resolvedCandidateResult.value, resolvedCandidateResult);\n }\n\n function selectDate(nextValue: DateValue) {\n const nextResult = {\n status: \"valid\",\n input: inputValue,\n value: nextValue,\n candidates: [],\n corrections: [],\n warnings: [],\n } satisfies ParseDateResult;\n const resolvedResult = resolveExpectedDateValue(nextResult, expectedValue, expectedOptions);\n if (resolvedResult.status !== \"valid\") {\n return;\n }\n\n updateValue(resolvedResult.value, resolvedResult);\n if (resolvedResult.value.kind === \"single\") {\n updateInputValue(resolvedResult.value.date.toString());\n }\n }\n\n return {\n calchemy: options.calchemy,\n parseContext: options.parseContext,\n inputValue,\n value,\n result: expectedResult,\n expectedValue,\n inputMode,\n valueKindMismatch,\n inlineCompletion,\n setInputValue: updateInputValue,\n setInputMode,\n acceptCompletion,\n selectCandidate,\n selectDate,\n getInputProps() {\n const activeCompletion = getActiveInlineCompletion();\n\n return {\n value: inputValue,\n readOnly: !fieldInputActive,\n onChange(event) {\n if (!fieldInputActive) {\n return;\n }\n\n updateInputValue(event.currentTarget.value);\n },\n onKeyDown(event) {\n if (!fieldInputActive) {\n return;\n }\n\n if (event.key === \"Tab\" && activeCompletion) {\n event.preventDefault();\n acceptCompletion();\n }\n },\n \"aria-invalid\": expectedResult.status === \"invalid\",\n ...(fieldInputActive && inlineCompletion\n ? {\n \"aria-description\": formatInlineCompletionDescription(\n inputValue,\n inlineCompletion,\n ),\n }\n : {}),\n \"calchemy-status\": valueKindMismatch ? \"kind-mismatch\" : expectedResult.status,\n \"calchemy-expected-value\": expectedValue,\n \"calchemy-value-kind\": expectedResult.status === \"valid\" ? expectedResult.value.kind : undefined,\n };\n },\n };\n}\n","import type { InlineCompletion } from \"@calchemy/date-core\";\n\nexport function composeInlineCompletion(\n inputValue: string,\n completion: InlineCompletion,\n): string {\n return `${inputValue}${completion.suffix}`;\n}\n\nexport function formatInlineCompletionDescription(\n inputValue: string,\n completion: InlineCompletion,\n): string {\n return `Suggestion: ${composeInlineCompletion(inputValue, completion)}. Press Tab to accept.`;\n}\n","import { useEffect, useState } from \"react\";\n\nexport const PARSE_QUERY_DEBOUNCE_MS = 150;\n\nexport function useDebouncedValue<T>(value: T, delayMs = PARSE_QUERY_DEBOUNCE_MS): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value);\n }, delayMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [value, delayMs]);\n\n return debouncedValue;\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, MouseEvent } from \"react\";\nimport type { PlainDate } from \"@calchemy/date-core\";\nimport { CalendarContext, useCalchemyCalendar, useCalchemyContext } from \"./context\";\nimport { CalendarGrid, CalendarWeekdays } from \"./CalendarGrid\";\nimport {\n addCalendarPeriod,\n buildCalendarPeriods,\n clampDateToBounds,\n formatCalendarWindowLabel,\n getCalendarPeriodAtOffset,\n getDateValueAnchor,\n getDateValueKey,\n getInitialPeriodExtensions,\n getSelectedValue,\n getToday,\n isBefore,\n isDateInCalendarViewport,\n parseCalendarDuration,\n periodIntersectsBounds,\n validateCalendarBounds,\n} from \"./date-model\";\nimport type { CalendarBounds, CalendarDuration, CalendarNamedDates, CalendarState } from \"./types\";\n\nconst defaultCalendarPeriod = { months: 1 } satisfies CalendarDuration;\n\nexport type CalchemyCalendarProps = Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\"> & {\n period?: CalendarDuration;\n bounds?: CalendarBounds;\n isDateDisabled?: CalendarState[\"isDateDisabled\"];\n namedDates?: CalendarNamedDates;\n};\n\nexport function Calendar({\n period = defaultCalendarPeriod,\n bounds,\n isDateDisabled,\n namedDates,\n children,\n ...divProps\n}: CalchemyCalendarProps) {\n const state = useCalchemyContext();\n const editable = state.inputMode === \"calendar\";\n validateCalendarBounds(bounds);\n const parsedPeriod = useMemo(() => parseCalendarDuration(period, \"period\"), [period]);\n const selected = getSelectedValue(state);\n const today = getToday(state);\n const [periodAnchor, setPeriodAnchor] = useState(() =>\n clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds),\n );\n const [navigationAnchor, setNavigationAnchor] = useState<{ date: PlainDate; inputValue: string } | null>(null);\n const [periodExtensions, setPeriodExtensions] = useState(() => getInitialPeriodExtensions(parsedPeriod));\n const [visiblePeriodIndex, setScrolledVisiblePeriodIndex] = useState<{\n anchor: string;\n inputValue: string;\n index: number;\n } | null>(null);\n const prevInputValueRef = useRef(state.inputValue);\n const prevSelectedKeyRef = useRef(getDateValueKey(selected));\n const prevExpectedValueRef = useRef(state.expectedValue);\n useEffect(() => {\n if (prevExpectedValueRef.current === state.expectedValue) {\n return;\n }\n\n prevExpectedValueRef.current = state.expectedValue;\n setScrolledVisiblePeriodIndex(null);\n setNavigationAnchor(null);\n setPeriodAnchor(clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds));\n prevInputValueRef.current = state.inputValue;\n prevSelectedKeyRef.current = getDateValueKey(selected);\n }, [bounds, selected, state.expectedValue, state.inputValue, today]);\n const periodAnchorKey = periodAnchor.toString();\n const activeVisiblePeriodIndex =\n visiblePeriodIndex?.anchor === periodAnchorKey && visiblePeriodIndex.inputValue === state.inputValue\n ? visiblePeriodIndex.index\n : 0;\n const weekStartsOn = state.parseContext?.weekStartsOn ?? 0;\n const locale = state.parseContext?.locale ?? \"en-US\";\n const periods = useMemo(\n () => buildCalendarPeriods(periodAnchor, parsedPeriod, weekStartsOn, locale, periodExtensions, bounds),\n [periodAnchor, parsedPeriod.count, parsedPeriod.unit, weekStartsOn, locale, periodExtensions, bounds],\n );\n const visiblePeriods = useMemo(\n () => {\n const visible = periods.filter(\n (item) =>\n item.index >= activeVisiblePeriodIndex && item.index < activeVisiblePeriodIndex + parsedPeriod.count,\n );\n\n return visible.length > 0 ? visible : periods.slice(0, parsedPeriod.count);\n },\n [periods, activeVisiblePeriodIndex, parsedPeriod.count],\n );\n const visiblePeriodAnchor = visiblePeriods[0]?.start ?? periodAnchor;\n\n useLayoutEffect(() => {\n const inputChanged = prevInputValueRef.current !== state.inputValue;\n prevInputValueRef.current = state.inputValue;\n\n const selectedKey = getDateValueKey(selected);\n const selectionChanged = prevSelectedKeyRef.current !== selectedKey;\n prevSelectedKeyRef.current = selectedKey;\n\n if (!inputChanged && !selectionChanged) {\n return;\n }\n\n if (selectionChanged && editable) {\n return;\n }\n\n const selectionAnchor = clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds);\n const inputReflectsCalendarSelection = state.inputValue === selectionAnchor.toString();\n const shouldRevealSelection = inputChanged && !inputReflectsCalendarSelection;\n\n if (\n !shouldRevealSelection &&\n isDateInCalendarViewport(\n selectionAnchor,\n periods,\n activeVisiblePeriodIndex,\n parsedPeriod.count,\n )\n ) {\n return;\n }\n\n setPeriodAnchor((current) => (current.equals(selectionAnchor) ? current : selectionAnchor));\n setScrolledVisiblePeriodIndex(null);\n }, [\n activeVisiblePeriodIndex,\n bounds,\n editable,\n parsedPeriod.count,\n periods,\n selected,\n state.inputValue,\n today,\n ]);\n\n function setCalendarPeriodAnchor(date: PlainDate) {\n const clamped = clampDateToBounds(date, bounds);\n setPeriodAnchor(clamped);\n setNavigationAnchor({ date: clamped, inputValue: state.inputValue });\n setPeriodExtensions(getInitialPeriodExtensions(parsedPeriod));\n setScrolledVisiblePeriodIndex(null);\n }\n\n function canMoveCalendar(unit: \"month\" | \"week\", count: number) {\n const target = addCalendarPeriod(visiblePeriodAnchor, unit, count);\n return target.equals(clampDateToBounds(target, bounds));\n }\n\n function canExtendCalendarPeriods(direction: \"before\" | \"after\", windows = 1) {\n if (!bounds) {\n return true;\n }\n\n const extendCount = parsedPeriod.count * windows;\n const firstIndex = periods[0]?.index ?? 0;\n const lastIndex = periods.at(-1)?.index ?? parsedPeriod.count - 1;\n const targetIndex = direction === \"before\" ? firstIndex - extendCount : lastIndex + 1;\n const targetPeriod = getCalendarPeriodAtOffset(periodAnchor, parsedPeriod, weekStartsOn, locale, targetIndex);\n\n return periodIntersectsBounds(targetPeriod, bounds);\n }\n\n const calendarState = useMemo(\n () =>\n ({\n calchemy: state,\n period: parsedPeriod,\n periodAnchor,\n visiblePeriodAnchor,\n today,\n selected,\n periods,\n visiblePeriods,\n weekStartsOn,\n locale,\n bounds,\n namedDates,\n editable,\n isDateDisabled,\n setPeriodAnchor: setCalendarPeriodAnchor,\n setVisiblePeriodIndex(index) {\n setScrolledVisiblePeriodIndex((current) => {\n if (\n current?.anchor === periodAnchorKey &&\n current.inputValue === state.inputValue &&\n current.index === index\n ) {\n return current;\n }\n\n return { anchor: periodAnchorKey, inputValue: state.inputValue, index };\n });\n },\n canMove: canMoveCalendar,\n move(unit, count) {\n if (!canMoveCalendar(unit, count)) {\n return;\n }\n\n const clamped = clampDateToBounds(addCalendarPeriod(visiblePeriodAnchor, unit, count), bounds);\n setPeriodAnchor(clamped);\n setNavigationAnchor({\n date: clamped,\n inputValue: state.inputValue,\n });\n setPeriodExtensions(getInitialPeriodExtensions(parsedPeriod));\n setScrolledVisiblePeriodIndex(null);\n },\n canExtendPeriods: canExtendCalendarPeriods,\n extendPeriods(direction, windows = 1) {\n if (!canExtendCalendarPeriods(direction, windows)) {\n return;\n }\n\n setPeriodExtensions((current) => ({\n ...current,\n [direction]: current[direction] + parsedPeriod.count * windows,\n }));\n },\n selectDate(date) {\n if (!editable) {\n return;\n }\n\n if (state.expectedValue === \"range\") {\n const current = selected;\n if (current?.kind === \"range\" && current.start.equals(current.end)) {\n const start = isBefore(current.start, date) ? current.start : date;\n const end = isBefore(current.start, date) ? date : current.start;\n state.selectDate({ kind: \"range\", start, end });\n return;\n }\n\n state.selectDate({ kind: \"range\", start: date, end: date });\n return;\n }\n\n state.selectDate({ kind: \"single\", date });\n },\n selectValue(value) {\n if (!editable) {\n return;\n }\n\n state.selectDate(value);\n },\n }) satisfies CalendarState,\n [\n state,\n parsedPeriod,\n periodAnchor,\n periodAnchorKey,\n visiblePeriodAnchor,\n today,\n selected,\n periods,\n visiblePeriods,\n weekStartsOn,\n locale,\n bounds,\n namedDates,\n editable,\n isDateDisabled,\n ],\n );\n\n const content = children ?? (\n <>\n <CalendarHeader>\n <CalendarPrevious />\n <CalendarHeading />\n <CalendarNext />\n </CalendarHeader>\n <CalendarWeekdays />\n <CalendarGrid />\n </>\n );\n\n return (\n <CalendarContext.Provider value={calendarState}>\n <div\n {...divProps}\n calchemy-calendar=\"\"\n calchemy-editable={editable ? \"\" : undefined}\n style={\n {\n ...divProps.style,\n \"--calchemy-calendar-period-count\": parsedPeriod.count,\n } as CSSProperties\n }\n >\n {content}\n </div>\n </CalendarContext.Provider>\n );\n}\n\nexport type CalchemyCalendarHeaderProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function CalendarHeader(props: CalchemyCalendarHeaderProps) {\n return <div {...props} calchemy-header=\"\" />;\n}\n\nexport type CalchemyCalendarHeadingProps = ComponentPropsWithoutRef<\"h2\">;\n\nexport function CalendarHeading(props: CalchemyCalendarHeadingProps) {\n const calendar = useCalchemyCalendar();\n\n return (\n <h2 {...props} calchemy-heading=\"\">\n {props.children ?? formatCalendarWindowLabel(calendar.visiblePeriods, calendar.locale)}\n </h2>\n );\n}\n\nexport type CalchemyCalendarNavigationProps = Omit<ComponentPropsWithoutRef<\"button\">, \"onClick\"> & {\n onClick?: ComponentPropsWithoutRef<\"button\">[\"onClick\"];\n};\n\nexport function CalendarPrevious({\n onClick,\n children,\n ...props\n}: CalchemyCalendarNavigationProps) {\n return (\n <CalendarNavigationButton\n {...props}\n direction={-1}\n calchemy-previous=\"\"\n onClick={onClick}\n >\n {children ?? \"Previous\"}\n </CalendarNavigationButton>\n );\n}\n\nexport function CalendarNext({\n onClick,\n children,\n ...props\n}: CalchemyCalendarNavigationProps) {\n return (\n <CalendarNavigationButton\n {...props}\n direction={1}\n calchemy-next=\"\"\n onClick={onClick}\n >\n {children ?? \"Next\"}\n </CalendarNavigationButton>\n );\n}\n\ntype CalendarNavigationButtonProps = CalchemyCalendarNavigationProps & {\n direction: -1 | 1;\n};\n\nfunction CalendarNavigationButton({\n direction,\n onClick,\n type = \"button\",\n ...props\n}: CalendarNavigationButtonProps) {\n const calendar = useCalchemyCalendar();\n const disabled =\n props.disabled ?? !calendar.canMove(calendar.period.unit, calendar.period.count * direction);\n\n function handleClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n calendar.move(calendar.period.unit, calendar.period.count * direction);\n }\n\n return <button {...props} type={type} disabled={disabled} onClick={handleClick} />;\n}\n","import { useMemo } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { useCalchemyCalendar, useCalendarPeriod } from \"./context\";\nimport {\n CalendarDragRectangleOverlay,\n getMultipleDates,\n getSelectedDateKeys,\n multipleDragSurfaceStyle,\n toggleDateKeys,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\nimport type { CalendarWeekdayFormat } from \"./types\";\nimport {\n buildCalendarWeeks,\n buildWeekdays,\n getCalendarDayState,\n getFirstVisibleCalendarPeriod,\n} from \"./date-model\";\n\nconst defaultCalendarWeekdayFormat = \"short\" satisfies CalendarWeekdayFormat;\n\nexport type CalchemyCalendarWeekdaysProps = ComponentPropsWithoutRef<\"div\"> & {\n weekdayFormat?: CalendarWeekdayFormat;\n};\n\nexport function CalendarWeekdays({\n weekdayFormat = defaultCalendarWeekdayFormat,\n ...props\n}: CalchemyCalendarWeekdaysProps) {\n const calendar = useCalchemyCalendar();\n const weekdays = buildWeekdays(calendar, weekdayFormat);\n\n return (\n <div {...props} calchemy-days=\"\">\n {weekdays.map((weekday) => (\n <div\n key={weekday.index}\n calchemy-weekday=\"\"\n calchemy-weekend={weekday.weekend ? \"\" : undefined}\n >\n {weekday.label}\n </div>\n ))}\n </div>\n );\n}\n\nexport type CalchemyCalendarGridProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n showBookends?: boolean;\n dragSelection?: boolean;\n};\n\nexport function CalendarGrid({\n showBookends = false,\n dragSelection = true,\n style,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarGridProps) {\n const calendar = useCalchemyCalendar();\n const period = useCalendarPeriod() ?? getFirstVisibleCalendarPeriod(calendar);\n const weeks = buildCalendarWeeks(period, calendar.weekStartsOn);\n const parentDrag = useOptionalCalendarPeriodDrag();\n const localDrag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n );\n const drag = parentDrag ?? localDrag;\n const multipleSelection = Boolean(drag?.multipleSelection);\n const useLocalDragHandlers = Boolean(drag && parentDrag === null);\n const committedSelectedKeys = useMemo(() => new Set(getSelectedDateKeys(calendar.selected)), [calendar.selected]);\n const previewSelectedKeys = drag?.previewSelectedKeys ?? new Set<string>();\n const dragState = drag?.dragState ?? null;\n\n return (\n <div\n {...props}\n calchemy-grid=\"\"\n calchemy-multiple-drag={useLocalDragHandlers ? \"\" : undefined}\n calchemy-dragging={useLocalDragHandlers && dragState ? \"\" : undefined}\n style={useLocalDragHandlers ? { ...multipleDragSurfaceStyle, ...style } : style}\n onPointerDownCapture={\n useLocalDragHandlers\n ? (event) => {\n drag?.handlePointerDownCapture(event);\n onPointerDownCapture?.(event);\n }\n : onPointerDownCapture\n }\n onPointerMove={\n useLocalDragHandlers\n ? (event) => {\n drag?.handlePointerMove(event);\n onPointerMove?.(event);\n }\n : onPointerMove\n }\n onPointerUp={\n useLocalDragHandlers\n ? (event) => {\n drag?.handlePointerUp(event);\n onPointerUp?.(event);\n }\n : onPointerUp\n }\n onPointerCancel={\n useLocalDragHandlers\n ? (event) => {\n drag?.handlePointerCancel(event);\n onPointerCancel?.(event);\n }\n : onPointerCancel\n }\n onDragStart={\n useLocalDragHandlers\n ? (event) => {\n event.preventDefault();\n onDragStart?.(event);\n }\n : onDragStart\n }\n >\n {useLocalDragHandlers && drag?.dragRectangle ? (\n <CalendarDragRectangleOverlay dragRectangle={drag.dragRectangle} surfaceRef={drag.surfaceRef} />\n ) : null}\n {weeks.map((week) => (\n <div key={week[0]?.toString()} calchemy-week=\"\">\n {week.map((date) => {\n const dayState = getCalendarDayState(calendar, period, date);\n const namedDateLabels = dayState.namedDates.map((item) => item.value).join(\", \");\n const dateKey = date.toString();\n const selected = multipleSelection\n ? dragState\n ? previewSelectedKeys.has(dateKey)\n : committedSelectedKeys.has(dateKey)\n : dayState.selected;\n const dragPreview = Boolean(dragState && selected !== dayState.selected);\n if (dayState.outside && !showBookends) {\n return (\n <div\n key={date.toString()}\n aria-hidden=\"true\"\n calchemy-cell=\"\"\n calchemy-blank=\"\"\n />\n );\n }\n\n return (\n <button\n type=\"button\"\n key={date.toString()}\n ref={(element) =>\n drag?.registerDay(element, date, dayState.disabled || !calendar.editable)\n }\n calchemy-date=\"\"\n calchemy-selected={selected ? \"\" : undefined}\n calchemy-drag-preview={dragPreview ? \"\" : undefined}\n calchemy-drag-preview-selected={dragPreview && selected ? \"\" : undefined}\n calchemy-drag-preview-deselected={dragPreview && !selected ? \"\" : undefined}\n calchemy-today={dayState.today ? \"\" : undefined}\n calchemy-weekend={dayState.weekend ? \"\" : undefined}\n calchemy-outside={dayState.outside ? \"\" : undefined}\n calchemy-first-of-period={dayState.firstOfPeriod ? \"\" : undefined}\n calchemy-last-of-period={dayState.lastOfPeriod ? \"\" : undefined}\n calchemy-disabled={dayState.disabled ? \"\" : undefined}\n calchemy-out-of-bounds={!dayState.bounded ? \"\" : undefined}\n calchemy-named-date={dayState.namedDates.length > 0 ? \"\" : undefined}\n calchemy-holiday={dayState.namedDates.some((item) => item.isHoliday) ? \"\" : undefined}\n calchemy-named-date-labels={namedDateLabels || undefined}\n aria-disabled={!calendar.editable && !dayState.disabled ? true : undefined}\n disabled={dayState.disabled}\n onClick={() => {\n if (!calendar.editable) {\n return;\n }\n\n if (drag?.suppressClickRef.current) {\n drag.suppressClickRef.current = false;\n return;\n }\n if (!dayState.disabled) {\n if (multipleSelection) {\n const selectedDates = getMultipleDates(calendar.selected);\n const nextKeys = toggleDateKeys(\n selectedDates.map((selectedDate) => selectedDate.toString()),\n [dateKey],\n );\n const nextDates = nextKeys.flatMap((key) => {\n if (key === dateKey) {\n return [date];\n }\n\n const existing = selectedDates.find((selectedDate) => selectedDate.toString() === key);\n return existing ? [existing] : [];\n });\n calendar.selectValue({\n kind: \"multiple\",\n dates: nextDates,\n });\n } else {\n calendar.selectDate(date);\n }\n }\n }}\n >\n {date.day}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type PointerEvent,\n type RefObject,\n} from \"react\";\nimport type { DateValue, PlainDate } from \"@calchemy/date-core\";\nimport { useCalchemyCalendar } from \"./context\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\ntype CellBounds = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\ntype DragState = {\n pointerId: number;\n start: Point;\n current: Point;\n baseDates: PlainDate[];\n previewKeys: string[];\n hasMoved: boolean;\n startDayCell: DayCell | null;\n cellBounds: ReadonlyMap<string, CellBounds>;\n};\n\ntype DayCell = {\n date: PlainDate;\n disabled: boolean;\n element: HTMLButtonElement;\n};\n\ntype DragRectangle = {\n start: Point;\n current: Point;\n};\n\nexport type CalendarPeriodDragContextValue = {\n multipleSelection: boolean;\n dragState: DragState | null;\n dragRectangle: DragRectangle | null;\n previewSelectedKeys: ReadonlySet<string>;\n suppressClickRef: RefObject<boolean>;\n surfaceRef: RefObject<HTMLElement | null>;\n registerDay(element: HTMLButtonElement | null, date: PlainDate, disabled: boolean): void;\n handlePointerDownCapture(event: PointerEvent<HTMLElement>): void;\n handlePointerMove(event: PointerEvent<HTMLElement>): void;\n handlePointerUp(event: PointerEvent<HTMLElement>): void;\n handlePointerCancel(event: PointerEvent<HTMLElement>): void;\n};\n\nconst CalendarPeriodDragContext = createContext<CalendarPeriodDragContextValue | null>(null);\n\nexport const multipleDragSurfaceStyle = {\n position: \"relative\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n touchAction: \"none\",\n} as const;\n\nexport const multiplePeriodListDragSurfaceStyle = {\n ...multipleDragSurfaceStyle,\n position: \"relative\",\n background: \"transparent\",\n} as const;\n\nexport function useOptionalCalendarPeriodDrag(): CalendarPeriodDragContextValue | null {\n return useContext(CalendarPeriodDragContext);\n}\n\nexport function useCalendarPeriodDragSurface(\n dragSelection = true,\n surfaceElementRef?: RefObject<HTMLElement | null>,\n): CalendarPeriodDragContextValue | null {\n const calendar = useCalchemyCalendar();\n const multipleSelection = dragSelection && calendar.calchemy.expectedValue === \"multiple\";\n const surfaceRef = useRef<HTMLElement | null>(null);\n const dayCells = useRef(new Map<string, DayCell>());\n const suppressClickRef = useRef(false);\n const dragStateRef = useRef<DragState | null>(null);\n const dragPreviewFrameRef = useRef<number | null>(null);\n const dragGestureCleanupRef = useRef<(() => void) | null>(null);\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragRectangle, setDragRectangle] = useState<DragRectangle | null>(null);\n const previewSelectedKeys = useMemo(\n () => new Set(dragState?.previewKeys ?? []),\n [dragState],\n );\n\n const acquireDragGestureLock = useCallback(() => {\n if (dragGestureCleanupRef.current || typeof document === \"undefined\") {\n return;\n }\n\n const preventGestureDefault = (event: Event) => {\n event.preventDefault();\n };\n\n const clearDocumentSelection = () => {\n document.getSelection()?.removeAllRanges();\n };\n\n const previousBodyUserSelect = document.body.style.userSelect;\n const previousDocumentUserSelect = document.documentElement.style.userSelect;\n document.body.style.userSelect = \"none\";\n document.documentElement.style.userSelect = \"none\";\n\n document.addEventListener(\"pointermove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"touchmove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"wheel\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.addEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n clearDocumentSelection();\n\n dragGestureCleanupRef.current = () => {\n document.removeEventListener(\"pointermove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"touchmove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"wheel\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n document.body.style.userSelect = previousBodyUserSelect;\n document.documentElement.style.userSelect = previousDocumentUserSelect;\n clearDocumentSelection();\n dragGestureCleanupRef.current = null;\n };\n }, []);\n\n const releaseDragGestureLock = useCallback(() => {\n dragGestureCleanupRef.current?.();\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n }\n }, []);\n\n const scheduleDragPreviewUpdate = useCallback((nextDragState: DragState) => {\n dragStateRef.current = nextDragState;\n if (dragPreviewFrameRef.current !== null) {\n return;\n }\n\n dragPreviewFrameRef.current = requestAnimationFrame(() => {\n setDragState(dragStateRef.current);\n dragPreviewFrameRef.current = null;\n });\n }, []);\n\n const registerDay = useCallback((element: HTMLButtonElement | null, date: PlainDate, disabled: boolean) => {\n const key = date.toString();\n if (element) {\n dayCells.current.set(key, { date, disabled, element });\n return;\n }\n\n dayCells.current.delete(key);\n }, []);\n\n const getDayCellFromTarget = useCallback((target: EventTarget | null): DayCell | null => {\n if (!(target instanceof Element)) {\n return null;\n }\n\n const button = target.closest(\"[calchemy-date]\");\n if (!(button instanceof HTMLButtonElement)) {\n return null;\n }\n\n for (const cell of dayCells.current.values()) {\n if (cell.element === button) {\n return cell;\n }\n }\n\n return null;\n }, []);\n\n const commitMultipleSelection = useCallback(\n (keys: Iterable<string>, fallbackDates: readonly PlainDate[] = []) => {\n const dates = resolveDateKeys(keys, dayCells.current, fallbackDates);\n calendar.selectValue({\n kind: \"multiple\",\n dates,\n });\n },\n [calendar],\n );\n\n const endDragGesture = useCallback(\n (pointerId?: number) => {\n if (pointerId !== undefined) {\n surfaceRef.current?.releasePointerCapture?.(pointerId);\n }\n\n releaseDragGestureLock();\n dragStateRef.current = null;\n setDragState(null);\n setDragRectangle(null);\n },\n [releaseDragGestureLock],\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n event.preventDefault();\n const current = getPointerPoint(event);\n setDragRectangle({ start: activeDrag.start, current });\n const dragRect = getDragRect(activeDrag.start, current);\n const clipRect = getDragClipRect(surfaceRef.current);\n const gestureKeys = getIntersectingDateKeys(\n dayCells.current,\n dragRect,\n activeDrag.cellBounds,\n clipRect,\n );\n const baseKeys = activeDrag.baseDates.map((date) => date.toString());\n const previewKeys = toggleDateKeys(baseKeys, gestureKeys);\n const hasMoved = activeDrag.hasMoved || hasPointerMoved(activeDrag.start, current);\n scheduleDragPreviewUpdate({\n ...activeDrag,\n current,\n previewKeys,\n hasMoved,\n });\n },\n [multipleSelection, scheduleDragPreviewUpdate],\n );\n\n const handlePointerDownCapture = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n if (!multipleSelection || event.button !== 0 || !event.isPrimary) {\n return;\n }\n\n const baseDates = getMultipleDates(calendar.selected);\n event.preventDefault();\n\n if (typeof document !== \"undefined\") {\n document.getSelection()?.removeAllRanges();\n }\n\n surfaceRef.current = surfaceElementRef?.current ?? event.currentTarget;\n surfaceRef.current?.setPointerCapture?.(event.pointerId);\n acquireDragGestureLock();\n const nextDragState: DragState = {\n pointerId: event.pointerId,\n start: getPointerPoint(event),\n current: getPointerPoint(event),\n baseDates,\n previewKeys: baseDates.map((selectedDate) => selectedDate.toString()),\n hasMoved: false,\n startDayCell: getDayCellFromTarget(event.target),\n cellBounds: snapshotCellBounds(dayCells.current),\n };\n dragStateRef.current = nextDragState;\n setDragState(nextDragState);\n setDragRectangle({\n start: nextDragState.start,\n current: nextDragState.current,\n });\n },\n [acquireDragGestureLock, calendar.selected, getDayCellFromTarget, multipleSelection, surfaceElementRef],\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n setDragState(activeDrag);\n }\n\n event.preventDefault();\n\n suppressClickRef.current = true;\n setTimeout(() => {\n suppressClickRef.current = false;\n }, 0);\n\n if (activeDrag.hasMoved) {\n commitMultipleSelection(activeDrag.previewKeys, activeDrag.baseDates);\n } else {\n const dayCell = activeDrag.startDayCell;\n if (dayCell && !dayCell.disabled) {\n const selectedDates = getMultipleDates(calendar.selected);\n const nextKeys = toggleDateKeys(\n selectedDates.map((selectedDate) => selectedDate.toString()),\n [dayCell.date.toString()],\n );\n commitMultipleSelection(nextKeys, selectedDates.concat(dayCell.date));\n }\n }\n\n endDragGesture(event.pointerId);\n\n const focused = document.activeElement;\n if (focused instanceof HTMLElement && event.currentTarget.contains(focused)) {\n focused.blur();\n }\n },\n [calendar.selected, commitMultipleSelection, endDragGesture, getDayCellFromTarget, multipleSelection],\n );\n\n const handlePointerCancel = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n endDragGesture(event.pointerId);\n },\n [endDragGesture],\n );\n\n return useMemo(() => {\n if (!multipleSelection) {\n return null;\n }\n\n return {\n multipleSelection,\n dragState,\n dragRectangle,\n previewSelectedKeys,\n suppressClickRef,\n surfaceRef,\n registerDay,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n };\n }, [\n dragRectangle,\n dragState,\n handlePointerCancel,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n multipleSelection,\n previewSelectedKeys,\n registerDay,\n ]);\n}\n\nexport type CalendarDragRectangleOverlayProps = {\n dragRectangle?: DragRectangle | null;\n surfaceRef?: RefObject<HTMLElement | null>;\n};\n\nexport function CalendarDragRectangleOverlay({\n dragRectangle: dragRectangleProp,\n surfaceRef: surfaceRefProp,\n}: CalendarDragRectangleOverlayProps = {}) {\n const drag = useOptionalCalendarPeriodDrag();\n const dragRectangle = dragRectangleProp ?? drag?.dragRectangle ?? null;\n const surfaceRef = surfaceRefProp ?? drag?.surfaceRef;\n\n if (!dragRectangle) {\n return null;\n }\n\n const surface = surfaceRef?.current;\n if (!surface) {\n return null;\n }\n\n const surfaceRect = surface.getBoundingClientRect();\n const left = Math.min(dragRectangle.start.x, dragRectangle.current.x) - surfaceRect.left;\n const top = Math.min(dragRectangle.start.y, dragRectangle.current.y) - surfaceRect.top;\n const width = Math.abs(dragRectangle.current.x - dragRectangle.start.x);\n const height = Math.abs(dragRectangle.current.y - dragRectangle.start.y);\n\n return (\n <div\n aria-hidden=\"true\"\n calchemy-drag-rect=\"\"\n style={{\n position: \"absolute\",\n left,\n top,\n width,\n height,\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n );\n}\n\nexport type CalendarPeriodDragProviderProps = {\n value: CalendarPeriodDragContextValue;\n children: React.ReactNode;\n};\n\nexport function CalendarPeriodDragProvider({ value, children }: CalendarPeriodDragProviderProps) {\n return (\n <CalendarPeriodDragContext.Provider value={value}>{children}</CalendarPeriodDragContext.Provider>\n );\n}\n\nexport function getMultipleDates(value: DateValue | null): PlainDate[] {\n return value?.kind === \"multiple\" ? value.dates : [];\n}\n\nexport function getSelectedDateKeys(value: DateValue | null): string[] {\n return getMultipleDates(value).map((date) => date.toString());\n}\n\nexport function toggleDateKeys(baseKeys: readonly string[], toggledKeys: readonly string[]): string[] {\n const next = new Set(baseKeys);\n for (const key of toggledKeys) {\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n }\n\n return Array.from(next).sort();\n}\n\nfunction getPointerPoint(event: Pick<PointerEvent, \"clientX\" | \"clientY\">): Point {\n return { x: event.clientX, y: event.clientY };\n}\n\nfunction hasPointerMoved(start: Point, current: Point): boolean {\n return Math.abs(start.x - current.x) > 2 || Math.abs(start.y - current.y) > 2;\n}\n\nfunction getDragRect(start: Point, current: Point): DOMRect {\n const left = Math.min(start.x, current.x);\n const right = Math.max(start.x, current.x);\n const top = Math.min(start.y, current.y);\n const bottom = Math.max(start.y, current.y);\n\n return {\n left,\n right,\n top,\n bottom,\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n toJSON: () => ({}),\n } as DOMRect;\n}\n\nfunction snapshotCellBounds(cells: ReadonlyMap<string, DayCell>): Map<string, CellBounds> {\n const bounds = new Map<string, CellBounds>();\n for (const [key, cell] of cells) {\n const rect = cell.element.getBoundingClientRect();\n bounds.set(key, {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n });\n }\n\n return bounds;\n}\n\nfunction getDragClipRect(surface: HTMLElement | null): CellBounds | null {\n if (!surface) {\n return null;\n }\n\n const scrollContainer = surface.closest(\"[calchemy-scroll]\");\n if (!(scrollContainer instanceof HTMLElement)) {\n return null;\n }\n\n const rect = scrollContainer.getBoundingClientRect();\n\n return {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n };\n}\n\nfunction clipBoundsToRect(\n bounds: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n clip: CellBounds,\n): CellBounds | null {\n const left = Math.max(bounds.left, clip.left);\n const right = Math.min(bounds.right, clip.right);\n const top = Math.max(bounds.top, clip.top);\n const bottom = Math.min(bounds.bottom, clip.bottom);\n\n if (left > right || top > bottom) {\n return null;\n }\n\n return { left, right, top, bottom };\n}\n\nfunction getIntersectingDateKeys(\n cells: ReadonlyMap<string, DayCell>,\n dragRect: DOMRect,\n cellBounds: ReadonlyMap<string, CellBounds>,\n clipRect: CellBounds | null = null,\n): string[] {\n const clippedDragRect = clipRect ? clipBoundsToRect(dragRect, clipRect) : dragRect;\n if (!clippedDragRect) {\n return [];\n }\n\n return Array.from(cells.entries())\n .filter(([key, cell]) => {\n const bounds = cellBounds.get(key);\n if (!bounds || cell.disabled) {\n return false;\n }\n\n const visibleBounds = clipRect ? clipBoundsToRect(bounds, clipRect) : bounds;\n return visibleBounds && rectsIntersect(clippedDragRect, visibleBounds);\n })\n .map(([key]) => key);\n}\n\nfunction rectsIntersect(\n left: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n right: CellBounds,\n): boolean {\n return left.left <= right.right && left.right >= right.left && left.top <= right.bottom && left.bottom >= right.top;\n}\n\nfunction resolveDateKeys(\n keys: Iterable<string>,\n cells: ReadonlyMap<string, DayCell>,\n fallbackDates: readonly PlainDate[],\n): PlainDate[] {\n const fallbackByKey = new Map(fallbackDates.map((date) => [date.toString(), date]));\n return Array.from(keys)\n .sort()\n .flatMap((key) => {\n const date = cells.get(key)?.date ?? fallbackByKey.get(key);\n return date ? [date] : [];\n });\n}\n","import type {\n DateOrder,\n DateValue,\n NamedDatesVocabularyEntry,\n PlainDate,\n WeekdayIndex,\n} from \"@calchemy/date-core\";\nimport type { CalchemyState } from \"../../hooks/useCalchemy\";\nimport type {\n CalendarBounds,\n CalendarDayState,\n CalendarDuration,\n CalendarPeriodModel,\n CalendarPeriodUnit,\n CalendarState,\n CalendarWeekdayFormat,\n ParsedCalendarPeriod,\n} from \"./types\";\n\nconst defaultDateOrderPreference: DateOrder[] = [\"DMY\", \"MDY\", \"YMD\"];\ntype NamedDateResolveContext = Parameters<NamedDatesVocabularyEntry[\"resolveDate\"]>[0][\"context\"];\n\nexport function getFirstVisibleCalendarPeriod(calendar: CalendarState): CalendarPeriodModel {\n const period = calendar.visiblePeriods[0];\n if (!period) {\n throw new Error(\"Calchemy.Calendar requires at least one visible generated period.\");\n }\n\n return period;\n}\n\nexport function getCalendarDayState(\n calendar: CalendarState,\n period: CalendarPeriodModel,\n date: PlainDate,\n): CalendarDayState {\n const bounded = isDateWithinBounds(date, calendar.bounds);\n const namedDates = getNamedDatesForDate(calendar, date);\n const disabled =\n !bounded || (calendar.isDateDisabled?.(date, calendar) ?? false);\n\n return {\n outside: isBefore(date, period.start) || isAfter(date, period.end),\n selected: isSelectedDate(calendar.selected, date),\n today: calendar.today.equals(date),\n weekend: isWeekend(date),\n firstOfPeriod: date.equals(period.start),\n lastOfPeriod: date.equals(period.end),\n bounded,\n disabled,\n namedDates,\n };\n}\n\nexport function parseCalendarDuration(value: CalendarDuration, propName: string): ParsedCalendarPeriod {\n const hasMonths = \"months\" in value;\n const hasWeeks = \"weeks\" in value;\n if (hasMonths === hasWeeks) {\n throw new Error(`Calchemy.Calendar ${propName} must include exactly one of months or weeks.`);\n }\n\n const count = hasMonths ? value.months : value.weeks;\n if (!Number.isInteger(count) || count < 1) {\n throw new Error(`Calchemy.Calendar ${propName} must be a positive integer duration.`);\n }\n\n return {\n unit: hasMonths ? \"month\" : \"week\",\n count,\n };\n}\n\nexport function validateCalendarBounds(bounds: CalendarBounds | undefined): void {\n if (bounds?.start && bounds.end && isAfter(bounds.start, bounds.end)) {\n throw new Error(\"Calchemy.Calendar bounds.start must be on or before bounds.end.\");\n }\n}\n\nexport function clampDateToBounds(date: PlainDate, bounds: CalendarBounds | undefined): PlainDate {\n if (bounds?.start && isBefore(date, bounds.start)) {\n return bounds.start;\n }\n if (bounds?.end && isAfter(date, bounds.end)) {\n return bounds.end;\n }\n\n return date;\n}\n\nexport function isDateWithinBounds(date: PlainDate, bounds: CalendarBounds | undefined): boolean {\n return (!bounds?.start || !isBefore(date, bounds.start)) && (!bounds?.end || !isAfter(date, bounds.end));\n}\n\nexport function periodIntersectsBounds(period: CalendarPeriodModel, bounds: CalendarBounds | undefined): boolean {\n return (!bounds?.start || !isBefore(period.end, bounds.start)) && (!bounds?.end || !isAfter(period.start, bounds.end));\n}\n\nexport function getCalendarPeriodAtOffset(\n anchor: PlainDate,\n period: ParsedCalendarPeriod,\n weekStartsOn: WeekdayIndex,\n locale: string,\n offset: number,\n): CalendarPeriodModel {\n const firstStart = period.unit === \"month\" ? startOfMonth(anchor) : startOfWeek(anchor, weekStartsOn);\n const start = addCalendarPeriod(firstStart, period.unit, offset);\n const end = period.unit === \"month\" ? endOfMonth(start) : start.add({ days: 6 });\n\n return {\n id: `${period.unit}-${start.toString()}`,\n unit: period.unit,\n index: offset,\n start,\n end,\n label: formatPeriodLabel(start, end, period.unit, locale),\n };\n}\n\nexport function getInitialPeriodExtensions(period: ParsedCalendarPeriod): { before: number; after: number } {\n return {\n before: period.count * 6,\n after: period.count * 3,\n };\n}\n\nexport function getSelectedValue(state: CalchemyState): DateValue | null {\n const resultValue = getResultValue(state);\n return state.value ?? resultValue;\n}\n\nexport function getDateValueAnchor(value: DateValue | null): PlainDate | null {\n if (!value) {\n return null;\n }\n\n switch (value.kind) {\n case \"single\":\n return value.date;\n case \"range\":\n return value.start;\n case \"multiple\":\n return value.dates[0] ?? null;\n }\n}\n\nexport function getDateValueKey(value: DateValue | null): string {\n if (!value) {\n return \"\";\n }\n\n switch (value.kind) {\n case \"single\":\n return `single:${value.date.toString()}`;\n case \"range\":\n return `range:${value.start.toString()}:${value.end.toString()}`;\n case \"multiple\":\n return `multiple:${value.dates.map((date) => date.toString()).join(\",\")}`;\n }\n}\n\nexport function isDateInCalendarViewport(\n date: PlainDate,\n periods: readonly CalendarPeriodModel[],\n visiblePeriodIndex: number,\n windowCount: number,\n): boolean {\n return periods\n .filter(\n (period) =>\n period.index >= visiblePeriodIndex && period.index < visiblePeriodIndex + windowCount,\n )\n .some((period) => !isBefore(date, period.start) && !isAfter(date, period.end));\n}\n\nfunction getResultValue(state: CalchemyState): DateValue | null {\n return state.result.status === \"valid\" ? state.result.value : null;\n}\n\nexport function getToday(state: CalchemyState): PlainDate {\n if (state.parseContext?.referenceDate) {\n return state.parseContext.referenceDate;\n }\n\n const todayResult = state.calchemy.parseDate(\"today\", state.parseContext);\n if (todayResult.status === \"valid\" && todayResult.value.kind === \"single\") {\n return todayResult.value.date;\n }\n\n return state.calchemy.Temporal.Now.plainDateISO(state.parseContext?.timeZone);\n}\n\nexport function buildCalendarPeriods(\n anchor: PlainDate,\n period: ParsedCalendarPeriod,\n weekStartsOn: WeekdayIndex,\n locale: string,\n extensions: { before: number; after: number },\n bounds?: CalendarBounds,\n): CalendarPeriodModel[] {\n const total = extensions.before + period.count + extensions.after;\n\n return Array.from({ length: total }, (_, index) => {\n const offset = index - extensions.before;\n return getCalendarPeriodAtOffset(anchor, period, weekStartsOn, locale, offset);\n }).filter((item) => periodIntersectsBounds(item, bounds));\n}\n\nexport function buildCalendarWeeks(period: CalendarPeriodModel, weekStartsOn: WeekdayIndex): PlainDate[][] {\n const start = startOfWeek(period.start, weekStartsOn);\n const end = endOfWeek(period.end, weekStartsOn);\n const weeks: PlainDate[][] = [];\n let cursor = start;\n\n while (!isAfter(cursor, end)) {\n const week = Array.from({ length: 7 }, (_, index) => cursor.add({ days: index }));\n weeks.push(week);\n cursor = cursor.add({ days: 7 });\n }\n\n return weeks;\n}\n\nexport function buildWeekdays(\n calendar: CalendarState,\n weekdayFormat: CalendarWeekdayFormat = \"short\",\n): Array<{ index: number; label: string; weekend: boolean }> {\n const sunday = startOfWeek(calendar.today, 0);\n const first = startOfWeek(calendar.today, calendar.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) => {\n const date = first.add({ days: index });\n const weekdayIndex = sunday.until(date).days % 7;\n return {\n index: weekdayIndex,\n label: date.toLocaleString(calendar.locale, { weekday: weekdayFormat }),\n weekend: isWeekend(date),\n };\n });\n}\n\nexport function addCalendarPeriod(date: PlainDate, unit: CalendarPeriodUnit, count: number): PlainDate {\n return unit === \"month\" ? date.add({ months: count }) : date.add({ weeks: count });\n}\n\nexport function formatCalendarWindowLabel(periods: CalendarPeriodModel[], locale: string): string {\n const first = periods[0];\n const last = periods.at(-1);\n if (!first || !last) {\n return \"\";\n }\n if (first.start.equals(last.start) && first.end.equals(last.end)) {\n return first.label;\n }\n\n return `${formatDateLabel(first.start, locale)} - ${formatDateLabel(last.end, locale)}`;\n}\n\nexport function formatMonthLabel(date: PlainDate, locale: string): string {\n return date.toLocaleString(locale, { month: \"long\" });\n}\n\nfunction startOfMonth(date: PlainDate): PlainDate {\n return date.with({ day: 1 });\n}\n\nfunction endOfMonth(date: PlainDate): PlainDate {\n return startOfMonth(date).add({ months: 1 }).subtract({ days: 1 });\n}\n\nfunction startOfWeek(date: PlainDate, weekStartsOn: WeekdayIndex): PlainDate {\n const temporalWeekday = weekStartsOn === 0 ? 7 : weekStartsOn;\n let cursor = date;\n\n while (cursor.dayOfWeek !== temporalWeekday) {\n cursor = cursor.subtract({ days: 1 });\n }\n\n return cursor;\n}\n\nfunction endOfWeek(date: PlainDate, weekStartsOn: WeekdayIndex): PlainDate {\n return startOfWeek(date, weekStartsOn).add({ days: 6 });\n}\n\nexport function isBefore(left: PlainDate, right: PlainDate): boolean {\n return left.toString() < right.toString();\n}\n\nexport function isAfter(left: PlainDate, right: PlainDate): boolean {\n return left.toString() > right.toString();\n}\n\nfunction isSelectedDate(value: DateValue | null, date: PlainDate): boolean {\n if (!value) {\n return false;\n }\n\n switch (value.kind) {\n case \"single\":\n return value.date.equals(date);\n case \"range\":\n return !isBefore(date, value.start) && !isAfter(date, value.end);\n case \"multiple\":\n return value.dates.some((selectedDate) => selectedDate.equals(date));\n }\n}\n\nfunction isWeekend(date: PlainDate): boolean {\n return date.dayOfWeek === 6 || date.dayOfWeek === 7;\n}\n\nfunction getNamedDatesForDate(calendar: CalendarState, date: PlainDate) {\n if (!calendar.namedDates) {\n return [];\n }\n\n const context = getResolvedNamedDateContext(calendar);\n return calendar.calchemy.calchemy.namedDatesVocabulary.filter((entry) => {\n if (calendar.namedDates === \"holidays\" && !entry.isHoliday) {\n return false;\n }\n\n return entry.resolveDate({ year: date.year, context })?.equals(date) ?? false;\n });\n}\n\nfunction getResolvedNamedDateContext(calendar: CalendarState): NamedDateResolveContext {\n const context = calendar.calchemy.parseContext;\n\n return {\n referenceDate:\n context?.referenceDate ??\n calendar.calchemy.calchemy.Temporal.Now.plainDateISO(context?.timeZone),\n locale: context?.locale ?? \"en-US\",\n weekStartsOn: context?.weekStartsOn ?? 0,\n dateOrderPreference: normalizeDateOrderPreference(context?.dateOrderPreference),\n lastNDaysIncludesToday: context?.lastNDaysIncludesToday ?? true,\n };\n}\n\nfunction normalizeDateOrderPreference(value: DateOrder[] | undefined): DateOrder[] {\n if (!value || value.length === 0) {\n return defaultDateOrderPreference;\n }\n\n return Array.from(new Set(value));\n}\n\nfunction formatPeriodLabel(start: PlainDate, end: PlainDate, unit: CalendarPeriodUnit, locale: string): string {\n if (unit === \"month\") {\n return formatDateLabel(start, locale);\n }\n\n return `${start.toLocaleString(locale, { month: \"short\", day: \"numeric\" })} - ${end.toLocaleString(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}`;\n}\n\nfunction formatDateLabel(date: PlainDate, locale: string): string {\n return date.toLocaleString(locale, { month: \"long\", year: \"numeric\" });\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { useCalchemyCalendar, useCalendarPeriod } from \"./context\";\nimport { getFirstVisibleCalendarPeriod } from \"./date-model\";\n\nexport type CalchemyCalendarPeriodHeadingProps = ComponentPropsWithoutRef<\"h3\">;\n\nexport function CalendarPeriodHeading(props: CalchemyCalendarPeriodHeadingProps) {\n const calendar = useCalchemyCalendar();\n const period = useCalendarPeriod() ?? getFirstVisibleCalendarPeriod(calendar);\n\n return (\n <h3 {...props} calchemy-period-heading=\"\">\n {props.children ?? period.label}\n </h3>\n );\n}\n","import { useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { CalendarPeriodContext, useCalchemyCalendar } from \"./context\";\nimport {\n CalendarDragRectangleOverlay,\n CalendarPeriodDragProvider,\n multipleDragSurfaceStyle,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\n\nexport type CalchemyCalendarPeriodProps = ComponentPropsWithoutRef<\"section\"> & {\n dragSelection?: boolean;\n};\n\nexport function CalendarPeriod({\n dragSelection = true,\n style,\n children,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarPeriodProps) {\n const period = useContext(CalendarPeriodContext);\n const calendar = useCalchemyCalendar();\n const parentDrag = useOptionalCalendarPeriodDrag();\n const drag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n );\n\n const content = drag ? (\n <CalendarPeriodDragProvider value={drag}>\n <CalendarDragRectangleOverlay />\n {children}\n </CalendarPeriodDragProvider>\n ) : (\n children\n );\n\n return (\n <section\n {...props}\n calchemy-period=\"\"\n calchemy-period-id={period?.id}\n calchemy-period-index={period?.index}\n calchemy-multiple-drag={drag ? \"\" : undefined}\n calchemy-dragging={drag?.dragState ? \"\" : undefined}\n style={\n drag\n ? { ...multipleDragSurfaceStyle, ...style }\n : parentDrag\n ? { touchAction: \"none\", ...style }\n : style\n }\n onPointerDownCapture={\n drag\n ? (event) => {\n drag.handlePointerDownCapture(event);\n onPointerDownCapture?.(event);\n }\n : onPointerDownCapture\n }\n onPointerMove={\n drag\n ? (event) => {\n drag.handlePointerMove(event);\n onPointerMove?.(event);\n }\n : onPointerMove\n }\n onPointerUp={\n drag\n ? (event) => {\n drag.handlePointerUp(event);\n onPointerUp?.(event);\n }\n : onPointerUp\n }\n onPointerCancel={\n drag\n ? (event) => {\n drag.handlePointerCancel(event);\n onPointerCancel?.(event);\n }\n : onPointerCancel\n }\n onDragStart={\n drag\n ? (event) => {\n event.preventDefault();\n onDragStart?.(event);\n }\n : onDragStart\n }\n >\n {content}\n </section>\n );\n}\n","import { useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { CalendarPeriodContext, CalendarScrollContext, useCalchemyCalendar } from \"./context\";\nimport { CalendarGrid, CalendarWeekdays } from \"./CalendarGrid\";\nimport { CalendarPeriodHeading } from \"./CalendarPeriodHeading\";\nimport { CalendarPeriod } from \"./CalendarPeriod\";\nimport {\n CalendarDragRectangleOverlay,\n CalendarPeriodDragProvider,\n multiplePeriodListDragSurfaceStyle,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\n\nexport type CalchemyCalendarPeriodListProps = ComponentPropsWithoutRef<\"div\"> & {\n dragSelection?: boolean;\n};\n\nexport function CalendarPeriodList({\n children,\n dragSelection = true,\n style,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarPeriodListProps) {\n const calendar = useCalchemyCalendar();\n const scrollContext = useContext(CalendarScrollContext);\n const parentDrag = useOptionalCalendarPeriodDrag();\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const hitCaptureRef = useRef<HTMLDivElement | null>(null);\n const drag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n surfaceRef,\n );\n const periods = scrollContext ? calendar.periods : calendar.visiblePeriods;\n\n useLayoutEffect(() => {\n if (!drag) {\n return;\n }\n\n const surface = surfaceRef.current;\n const hitCapture = hitCaptureRef.current;\n if (!surface || !hitCapture) {\n return;\n }\n\n const updateDragHitBounds = () => {\n const periodElements = surface.querySelectorAll<HTMLElement>(\"[calchemy-period]\");\n if (periodElements.length === 0) {\n hitCapture.style.removeProperty(\"inline-size\");\n hitCapture.style.removeProperty(\"block-size\");\n return;\n }\n\n let maxInlineEnd = 0;\n let maxBlockEnd = 0;\n for (const periodElement of periodElements) {\n maxInlineEnd = Math.max(maxInlineEnd, periodElement.offsetLeft + periodElement.offsetWidth);\n maxBlockEnd = Math.max(maxBlockEnd, periodElement.offsetTop + periodElement.offsetHeight);\n }\n\n hitCapture.style.inlineSize = `${maxInlineEnd}px`;\n hitCapture.style.blockSize = `${maxBlockEnd}px`;\n };\n\n updateDragHitBounds();\n\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const resizeObserver = new ResizeObserver(updateDragHitBounds);\n resizeObserver.observe(surface);\n for (const periodElement of surface.querySelectorAll<HTMLElement>(\"[calchemy-period]\")) {\n resizeObserver.observe(periodElement);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [drag, periods]);\n\n const spacerStyle =\n scrollContext?.direction === \"horizontal\"\n ? { gridColumn: `span ${scrollContext.leadingSpacerPeriodCount}` }\n : { blockSize: `${scrollContext?.leadingSpacerPixelSize ?? 0}px` };\n\n const periodContent = (\n <>\n {scrollContext && scrollContext.leadingSpacerPeriodCount > 0 ? (\n <div\n aria-hidden=\"true\"\n calchemy-scroll-spacer=\"\"\n style={spacerStyle}\n />\n ) : null}\n {periods.map((period) => (\n <CalendarPeriodContext.Provider key={period.id} value={period}>\n {children ?? (\n <CalendarPeriod>\n <CalendarPeriodHeading />\n <CalendarWeekdays />\n <CalendarGrid />\n </CalendarPeriod>\n )}\n </CalendarPeriodContext.Provider>\n ))}\n </>\n );\n\n const content = drag ? (\n <CalendarPeriodDragProvider value={drag}>\n <div\n ref={hitCaptureRef}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n pointerEvents: \"auto\",\n touchAction: \"none\",\n }}\n />\n <CalendarDragRectangleOverlay />\n {periodContent}\n </CalendarPeriodDragProvider>\n ) : (\n periodContent\n );\n\n return (\n <div\n {...props}\n ref={surfaceRef}\n calchemy-period-list=\"\"\n calchemy-multiple-drag={drag ? \"\" : undefined}\n calchemy-dragging={drag?.dragState ? \"\" : undefined}\n style={drag ? { ...multiplePeriodListDragSurfaceStyle, ...style } : style}\n onPointerDownCapture={\n drag\n ? (event) => {\n drag.handlePointerDownCapture(event);\n onPointerDownCapture?.(event);\n }\n : onPointerDownCapture\n }\n onPointerMove={\n drag\n ? (event) => {\n drag.handlePointerMove(event);\n onPointerMove?.(event);\n }\n : onPointerMove\n }\n onPointerUp={\n drag\n ? (event) => {\n drag.handlePointerUp(event);\n onPointerUp?.(event);\n }\n : onPointerUp\n }\n onPointerCancel={\n drag\n ? (event) => {\n drag.handlePointerCancel(event);\n onPointerCancel?.(event);\n }\n : onPointerCancel\n }\n onDragStart={\n drag\n ? (event) => {\n event.preventDefault();\n onDragStart?.(event);\n }\n : onDragStart\n }\n >\n {content}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ChangeEvent } from \"react\";\nimport { useCalchemyCalendar } from \"./context\";\nimport { formatMonthLabel, isAfter, isBefore } from \"./date-model\";\n\nexport type CalchemyCalendarMonthSelectProps = Omit<ComponentPropsWithoutRef<\"select\">, \"value\" | \"onChange\"> & {\n onChange?: ComponentPropsWithoutRef<\"select\">[\"onChange\"];\n};\n\nexport function CalendarMonthSelect({ onChange, ...props }: CalchemyCalendarMonthSelectProps) {\n const calendar = useCalchemyCalendar();\n const months = Array.from({ length: 12 }, (_, index) => index + 1).filter((month) =>\n isMonthWithinBounds(calendar.visiblePeriodAnchor.with({ month, day: 1 }), calendar),\n );\n\n return (\n <select\n {...props}\n calchemy-month-select=\"\"\n value={String(calendar.visiblePeriodAnchor.month)}\n onChange={(event) =>\n handleCalendarSelectChange(event, onChange, (value) =>\n calendar.setPeriodAnchor(calendar.visiblePeriodAnchor.with({ month: value, day: 1 })),\n )\n }\n >\n {months.map((month) => {\n const date = calendar.visiblePeriodAnchor.with({ month, day: 1 });\n return (\n <option key={month} value={String(month)}>\n {formatMonthLabel(date, calendar.locale)}\n </option>\n );\n })}\n </select>\n );\n}\n\nexport type CalchemyCalendarYearSelectProps = Omit<ComponentPropsWithoutRef<\"select\">, \"value\" | \"onChange\"> & {\n startYear?: number;\n endYear?: number;\n onChange?: ComponentPropsWithoutRef<\"select\">[\"onChange\"];\n};\n\nexport function CalendarYearSelect({ startYear, endYear, onChange, ...props }: CalchemyCalendarYearSelectProps) {\n const calendar = useCalchemyCalendar();\n const visibleYear = calendar.visiblePeriodAnchor.year;\n const firstYear = Math.min(calendar.bounds?.start?.year ?? startYear ?? visibleYear - 100, visibleYear);\n const lastYear = Math.max(calendar.bounds?.end?.year ?? endYear ?? visibleYear + 100, visibleYear);\n\n return (\n <select\n {...props}\n calchemy-year-select=\"\"\n value={String(visibleYear)}\n onChange={(event) =>\n handleCalendarSelectChange(event, onChange, (value) =>\n calendar.setPeriodAnchor(calendar.visiblePeriodAnchor.with({ year: value, day: 1 })),\n )\n }\n >\n {Array.from({ length: lastYear - firstYear + 1 }, (_, index) => firstYear + index).map((year) => (\n <option key={year} value={String(year)}>\n {year}\n </option>\n ))}\n </select>\n );\n}\n\nfunction handleCalendarSelectChange(\n event: ChangeEvent<HTMLSelectElement>,\n onChange: ComponentPropsWithoutRef<\"select\">[\"onChange\"] | undefined,\n updatePeriodAnchor: (value: number) => void,\n): void {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n updatePeriodAnchor(Number(event.currentTarget.value));\n}\n\nfunction isMonthWithinBounds(\n monthStart: ReturnType<typeof useCalchemyCalendar>[\"visiblePeriodAnchor\"],\n calendar: ReturnType<typeof useCalchemyCalendar>,\n): boolean {\n const monthEnd = monthStart.add({ months: 1 }).subtract({ days: 1 });\n\n return (\n (!calendar.bounds?.start || !isBefore(monthEnd, calendar.bounds.start)) &&\n (!calendar.bounds?.end || !isAfter(monthStart, calendar.bounds.end))\n );\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { CalchemyContext, useCalchemyContext } from \"./calendar/context\";\nimport { useCalchemy, type UseCalchemyOptions } from \"../hooks/useCalchemy\";\nimport {\n Calendar,\n CalendarHeader,\n CalendarHeading,\n CalendarNext,\n CalendarPrevious,\n} from \"./calendar/Calendar\";\nimport { CalendarGrid, CalendarWeekdays } from \"./calendar/CalendarGrid\";\nimport { CalendarPeriodHeading } from \"./calendar/CalendarPeriodHeading\";\nimport { CalendarPeriod } from \"./calendar/CalendarPeriod\";\nimport { CalendarPeriodList } from \"./calendar/CalendarPeriodList\";\nimport {\n CalendarMonthSelect,\n CalendarYearSelect,\n} from \"./calendar/CalendarSelects\";\n\nexport type CalchemyRootProps = UseCalchemyOptions & {\n children: ReactNode;\n};\n\nfunction Root(props: CalchemyRootProps) {\n const { children, ...options } = props;\n const state = useCalchemy(options);\n\n return (\n <CalchemyContext.Provider value={state}>\n {children}\n </CalchemyContext.Provider>\n );\n}\n\nexport type CalchemyFieldProps = Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"value\" | \"onChange\" | \"onKeyDown\"\n> & {\n renderInlineCompletion?: boolean;\n};\n\nfunction Field({\n renderInlineCompletion = true,\n readOnly,\n ...props\n}: CalchemyFieldProps) {\n const state = useCalchemyContext();\n const inputProps = state.getInputProps();\n const completion =\n state.inputMode === \"field\" ? state.inlineCompletion : null;\n\n return (\n <span\n calchemy-field=\"\"\n calchemy-input-mode={state.inputMode}\n calchemy-has-completion={completion ? \"\" : undefined}\n >\n {renderInlineCompletion && completion ? (\n <span calchemy-field-backdrop=\"\" aria-hidden=\"true\">\n <span calchemy-field-typed=\"\">{state.inputValue}</span>\n <span calchemy-completions=\"\">{completion.suffix}</span>\n </span>\n ) : null}\n <input {...props} {...inputProps} readOnly={readOnly ?? inputProps.readOnly} />\n </span>\n );\n}\n\nexport type CalchemyInputModeProps = ComponentPropsWithoutRef<\"div\"> & {\n fieldLabel?: ReactNode;\n calendarLabel?: ReactNode;\n};\n\nfunction InputMode({\n fieldLabel = \"Type\",\n calendarLabel = \"Pick\",\n ...props\n}: CalchemyInputModeProps) {\n const state = useCalchemyContext();\n\n return (\n <div {...props} calchemy-mode=\"\" calchemy-active={state.inputMode} role=\"group\">\n <button\n type=\"button\"\n calchemy-value=\"field\"\n aria-pressed={state.inputMode === \"field\"}\n onClick={() => state.setInputMode(\"field\")}\n >\n {fieldLabel}\n </button>\n <button\n type=\"button\"\n calchemy-value=\"calendar\"\n aria-pressed={state.inputMode === \"calendar\"}\n onClick={() => state.setInputMode(\"calendar\")}\n >\n {calendarLabel}\n </button>\n </div>\n );\n}\n\nexport type CalchemyCandidatesProps = ComponentPropsWithoutRef<\"div\">;\n\nfunction Candidates(props: CalchemyCandidatesProps) {\n const state = useCalchemyContext();\n\n if (state.inputMode !== \"field\" || state.result.status !== \"ambiguous\") {\n return null;\n }\n\n const candidates =\n state.expectedValue && state.expectedValue !== \"multiple\"\n ? state.result.candidates.filter(\n (candidate) => candidate.value.kind === state.expectedValue,\n )\n : state.result.candidates;\n\n if (candidates.length === 0) {\n return null;\n }\n\n return (\n <div {...props} calchemy-candidates=\"\">\n {candidates.map((candidate) => (\n <button\n type=\"button\"\n key={candidate.id}\n calchemy-candidate=\"\"\n onClick={() => state.selectCandidate(candidate.id)}\n >\n {candidate.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport { useCalchemyCalendar, useCalchemyContext } from \"./calendar/context\";\n\nexport type {\n CalendarBounds,\n CalendarDuration,\n CalendarNamedDates,\n CalendarPeriodModel,\n CalendarPeriodUnit,\n CalendarState,\n CalendarWeekdayFormat,\n ParsedCalendarPeriod,\n} from \"./calendar/types\";\nexport type {\n CalchemyCalendarHeaderProps,\n CalchemyCalendarHeadingProps,\n CalchemyCalendarNavigationProps,\n CalchemyCalendarProps,\n} from \"./calendar/Calendar\";\nexport type {\n CalchemyCalendarGridProps,\n CalchemyCalendarWeekdaysProps,\n} from \"./calendar/CalendarGrid\";\nexport type { CalchemyCalendarPeriodHeadingProps } from \"./calendar/CalendarPeriodHeading\";\nexport type { CalchemyCalendarPeriodListProps } from \"./calendar/CalendarPeriodList\";\nexport type { CalchemyCalendarPeriodProps } from \"./calendar/CalendarPeriod\";\nexport type {\n CalchemyCalendarMonthSelectProps,\n CalchemyCalendarYearSelectProps,\n} from \"./calendar/CalendarSelects\";\n\nexport const Calchemy = {\n Root,\n Field,\n InputMode,\n Candidates,\n Calendar,\n CalendarHeader,\n CalendarHeading,\n CalendarPrevious,\n CalendarNext,\n CalendarPeriodList,\n CalendarPeriod,\n CalendarPeriodHeading,\n CalendarWeekdays,\n CalendarGrid,\n CalendarMonthSelect,\n CalendarYearSelect,\n};\n"],"mappings":"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","names":["useEffect","useState","useState","useEffect","useEffect","useMemo","useRef","useState","useMemo","useMemo","useState","useState","useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","useRef","useEffect","jsx","useContext","jsx","jsxs","useContext","useContext","useLayoutEffect","useRef","Fragment","jsx","jsxs","useContext","useRef","useLayoutEffect","jsx","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useCalchemy.ts","../src/inline-completion.ts","../src/hooks/useDebouncedValue.ts","../src/components/calendar/Calendar.tsx","../src/components/calendar/CalendarGrid.tsx","../src/components/calendar/calendar-period-drag.tsx","../src/components/calendar/date-model.ts","../src/components/calendar/CalendarPeriodHeading.tsx","../src/components/calendar/CalendarPeriod.tsx","../src/components/calendar/CalendarPeriodList.tsx","../src/components/calendar/CalendarSelects.tsx","../src/components/Calchemy.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { resolveExpectedDateValue } from \"@calchemy/date-core\";\nimport {\n composeInlineCompletion,\n formatInlineCompletionDescription,\n} from \"../inline-completion\";\nimport { useDebouncedValue } from \"./useDebouncedValue\";\nimport type {\n Calchemy,\n DateValue,\n ExpectedDateValue,\n ParseDateContext,\n ParseDateResult,\n ResolveExpectedDateValueOptions,\n} from \"@calchemy/date-core\";\n\nexport type CalchemyInputMode = \"field\" | \"calendar\";\n\nexport type UseCalchemyOptions = ResolveExpectedDateValueOptions & {\n calchemy: Calchemy;\n expectedValue: ExpectedDateValue;\n value?: DateValue | null;\n defaultValue?: DateValue | null;\n onValueChange?: (value: DateValue | null, result: ParseDateResult) => void;\n parseContext?: ParseDateContext;\n inputValue?: string;\n defaultInputValue?: string;\n onInputValueChange?: (value: string) => void;\n inputMode?: CalchemyInputMode;\n defaultInputMode?: CalchemyInputMode;\n onInputModeChange?: (mode: CalchemyInputMode) => void;\n};\n\nexport type CalchemyState = {\n calchemy: Calchemy;\n parseContext: ParseDateContext | undefined;\n inputValue: string;\n value: DateValue | null;\n result: ParseDateResult;\n expectedValue: ExpectedDateValue;\n inputMode: CalchemyInputMode;\n valueKindMismatch: boolean;\n inlineCompletion: ReturnType<Calchemy[\"getInlineCompletion\"]>;\n setInputValue(value: string): void;\n setInputMode(mode: CalchemyInputMode): void;\n acceptCompletion(): void;\n selectCandidate(candidateId: string): void;\n selectDate(value: DateValue): void;\n getInputProps(): {\n value: string;\n readOnly: boolean;\n onChange(event: { currentTarget: { value: string } }): void;\n onKeyDown(event: { key: string; preventDefault(): void }): void;\n \"aria-invalid\": boolean;\n \"aria-description\"?: string;\n \"calchemy-status\": ParseDateResult[\"status\"] | \"kind-mismatch\";\n \"calchemy-expected-value\": ExpectedDateValue | undefined;\n \"calchemy-value-kind\": ExpectedDateValue | undefined;\n };\n};\n\nexport function useCalchemy(options: UseCalchemyOptions): CalchemyState {\n const [uncontrolledInputValue, setUncontrolledInputValue] = useState(options.defaultInputValue ?? \"\");\n const [uncontrolledValue, setUncontrolledValue] = useState<DateValue | null>(options.defaultValue ?? null);\n const [uncontrolledInputMode, setUncontrolledInputMode] = useState<CalchemyInputMode>(\n options.defaultInputMode ?? \"field\",\n );\n const inputValue = options.inputValue ?? uncontrolledInputValue;\n const value = options.value ?? uncontrolledValue;\n const inputMode = options.inputMode ?? uncontrolledInputMode;\n const fieldInputActive = inputMode === \"field\";\n const queryValue = useDebouncedValue(inputValue);\n const queryPending = inputValue !== queryValue;\n const result = useMemo(\n () => options.calchemy.parseDate(queryValue, options.parseContext),\n [queryValue, options.calchemy, options.parseContext],\n );\n const expectedValue = options.expectedValue;\n const expectedOptions = {\n ...(options.multipleRangeExpansionLimit === undefined\n ? {}\n : { multipleRangeExpansionLimit: options.multipleRangeExpansionLimit }),\n } satisfies ResolveExpectedDateValueOptions;\n const expectedResult = resolveExpectedDateValue(result, expectedValue, expectedOptions);\n const valueKindMismatch = expectedResult.status === \"invalid\" && result.status === \"valid\";\n const settledInlineCompletion = useMemo(\n () => options.calchemy.getInlineCompletion(queryValue, options.parseContext),\n [queryValue, options.calchemy, options.parseContext],\n );\n const inlineCompletion = queryPending ? null : settledInlineCompletion;\n\n function updateValue(nextValue: DateValue | null, nextResult: ParseDateResult = result) {\n if (options.value === undefined) {\n setUncontrolledValue(nextValue);\n }\n options.onValueChange?.(nextValue, nextResult);\n }\n\n useEffect(() => {\n const nextResult = options.calchemy.parseDate(queryValue, options.parseContext);\n const nextExpectedResult = resolveExpectedDateValue(\n nextResult,\n expectedValue,\n expectedOptions,\n );\n if (nextExpectedResult.status === \"valid\") {\n if (options.value === undefined) {\n setUncontrolledValue(nextExpectedResult.value);\n }\n options.onValueChange?.(nextExpectedResult.value, nextExpectedResult);\n }\n }, [\n queryValue,\n expectedValue,\n expectedOptions.multipleRangeExpansionLimit,\n options.calchemy,\n options.parseContext,\n ]);\n\n function updateInputValue(nextValue: string) {\n if (options.inputValue === undefined) {\n setUncontrolledInputValue(nextValue);\n }\n options.onInputValueChange?.(nextValue);\n }\n\n function getActiveInlineCompletion() {\n if (!fieldInputActive || queryPending) {\n return null;\n }\n\n return settledInlineCompletion;\n }\n\n function setInputMode(nextMode: CalchemyInputMode) {\n if (options.inputMode === undefined) {\n setUncontrolledInputMode(nextMode);\n }\n options.onInputModeChange?.(nextMode);\n }\n\n function acceptCompletion() {\n const activeCompletion = getActiveInlineCompletion();\n if (!activeCompletion) {\n return;\n }\n\n updateInputValue(composeInlineCompletion(inputValue, activeCompletion));\n }\n\n function selectCandidate(candidateId: string) {\n if (!fieldInputActive || result.status !== \"ambiguous\") {\n return;\n }\n\n const candidate = result.candidates.find((item) => item.id === candidateId);\n if (!candidate) {\n return;\n }\n\n const candidateResult = {\n status: \"valid\",\n input: inputValue,\n value: candidate.value,\n candidates: [candidate],\n corrections: result.corrections,\n warnings: result.warnings,\n } satisfies ParseDateResult;\n const resolvedCandidateResult = resolveExpectedDateValue(candidateResult, expectedValue, expectedOptions);\n if (resolvedCandidateResult.status !== \"valid\") {\n return;\n }\n\n updateValue(resolvedCandidateResult.value, resolvedCandidateResult);\n }\n\n function selectDate(nextValue: DateValue) {\n const nextResult = {\n status: \"valid\",\n input: inputValue,\n value: nextValue,\n candidates: [],\n corrections: [],\n warnings: [],\n } satisfies ParseDateResult;\n const resolvedResult = resolveExpectedDateValue(nextResult, expectedValue, expectedOptions);\n if (resolvedResult.status !== \"valid\") {\n return;\n }\n\n updateValue(resolvedResult.value, resolvedResult);\n if (resolvedResult.value.kind === \"single\") {\n updateInputValue(resolvedResult.value.date.toString());\n }\n }\n\n return {\n calchemy: options.calchemy,\n parseContext: options.parseContext,\n inputValue,\n value,\n result: expectedResult,\n expectedValue,\n inputMode,\n valueKindMismatch,\n inlineCompletion,\n setInputValue: updateInputValue,\n setInputMode,\n acceptCompletion,\n selectCandidate,\n selectDate,\n getInputProps() {\n const activeCompletion = getActiveInlineCompletion();\n\n return {\n value: inputValue,\n readOnly: !fieldInputActive,\n onChange(event) {\n if (!fieldInputActive) {\n return;\n }\n\n updateInputValue(event.currentTarget.value);\n },\n onKeyDown(event) {\n if (!fieldInputActive) {\n return;\n }\n\n if (event.key === \"Tab\" && activeCompletion) {\n event.preventDefault();\n acceptCompletion();\n }\n },\n \"aria-invalid\": expectedResult.status === \"invalid\",\n ...(fieldInputActive && inlineCompletion\n ? {\n \"aria-description\": formatInlineCompletionDescription(\n inputValue,\n inlineCompletion,\n ),\n }\n : {}),\n \"calchemy-status\": valueKindMismatch ? \"kind-mismatch\" : expectedResult.status,\n \"calchemy-expected-value\": expectedValue,\n \"calchemy-value-kind\": expectedResult.status === \"valid\" ? expectedResult.value.kind : undefined,\n };\n },\n };\n}\n","import type { InlineCompletion } from \"@calchemy/date-core\";\n\nexport function composeInlineCompletion(\n inputValue: string,\n completion: InlineCompletion,\n): string {\n return `${inputValue}${completion.suffix}`;\n}\n\nexport function formatInlineCompletionDescription(\n inputValue: string,\n completion: InlineCompletion,\n): string {\n return `Suggestion: ${composeInlineCompletion(inputValue, completion)}. Press Tab to accept.`;\n}\n","import { useEffect, useState } from \"react\";\n\nexport const PARSE_QUERY_DEBOUNCE_MS = 150;\n\nexport function useDebouncedValue<T>(value: T, delayMs = PARSE_QUERY_DEBOUNCE_MS): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value);\n }, delayMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [value, delayMs]);\n\n return debouncedValue;\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, MouseEvent } from \"react\";\nimport type { PlainDate } from \"@calchemy/date-core\";\nimport { CalendarContext, useCalchemyCalendar, useCalchemyContext } from \"./context\";\nimport { CalendarGrid, CalendarWeekdays } from \"./CalendarGrid\";\nimport {\n addCalendarPeriod,\n buildCalendarPeriods,\n clampDateToBounds,\n formatCalendarWindowLabel,\n getCalendarPeriodAtOffset,\n getDateValueAnchor,\n getDateValueKey,\n getInitialPeriodExtensions,\n getSelectedValue,\n getToday,\n isBefore,\n isDateInCalendarViewport,\n parseCalendarDuration,\n periodIntersectsBounds,\n validateCalendarBounds,\n} from \"./date-model\";\nimport type { CalendarBounds, CalendarDuration, CalendarNamedDates, CalendarState } from \"./types\";\n\nconst defaultCalendarPeriod = { months: 1 } satisfies CalendarDuration;\n\nexport type CalchemyCalendarProps = Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\"> & {\n period?: CalendarDuration;\n bounds?: CalendarBounds;\n isDateDisabled?: CalendarState[\"isDateDisabled\"];\n namedDates?: CalendarNamedDates;\n};\n\nexport function Calendar({\n period = defaultCalendarPeriod,\n bounds,\n isDateDisabled,\n namedDates,\n children,\n ...divProps\n}: CalchemyCalendarProps) {\n const state = useCalchemyContext();\n const editable = state.inputMode === \"calendar\";\n validateCalendarBounds(bounds);\n const parsedPeriod = useMemo(() => parseCalendarDuration(period, \"period\"), [period]);\n const selected = getSelectedValue(state);\n const today = getToday(state);\n const [periodAnchor, setPeriodAnchor] = useState(() =>\n clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds),\n );\n const [navigationAnchor, setNavigationAnchor] = useState<{ date: PlainDate; inputValue: string } | null>(null);\n const [periodExtensions, setPeriodExtensions] = useState(() => getInitialPeriodExtensions(parsedPeriod));\n const [visiblePeriodIndex, setScrolledVisiblePeriodIndex] = useState<{\n anchor: string;\n inputValue: string;\n index: number;\n } | null>(null);\n const prevInputValueRef = useRef(state.inputValue);\n const prevSelectedKeyRef = useRef(getDateValueKey(selected));\n const prevExpectedValueRef = useRef(state.expectedValue);\n useEffect(() => {\n if (prevExpectedValueRef.current === state.expectedValue) {\n return;\n }\n\n prevExpectedValueRef.current = state.expectedValue;\n setScrolledVisiblePeriodIndex(null);\n setNavigationAnchor(null);\n setPeriodAnchor(clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds));\n prevInputValueRef.current = state.inputValue;\n prevSelectedKeyRef.current = getDateValueKey(selected);\n }, [bounds, selected, state.expectedValue, state.inputValue, today]);\n const periodAnchorKey = periodAnchor.toString();\n const activeVisiblePeriodIndex =\n visiblePeriodIndex?.anchor === periodAnchorKey && visiblePeriodIndex.inputValue === state.inputValue\n ? visiblePeriodIndex.index\n : 0;\n const weekStartsOn = state.parseContext?.weekStartsOn ?? 0;\n const locale = state.parseContext?.locale ?? \"en-US\";\n const periods = useMemo(\n () => buildCalendarPeriods(periodAnchor, parsedPeriod, weekStartsOn, locale, periodExtensions, bounds),\n [periodAnchor, parsedPeriod.count, parsedPeriod.unit, weekStartsOn, locale, periodExtensions, bounds],\n );\n const visiblePeriods = useMemo(\n () => {\n const visible = periods.filter(\n (item) =>\n item.index >= activeVisiblePeriodIndex && item.index < activeVisiblePeriodIndex + parsedPeriod.count,\n );\n\n return visible.length > 0 ? visible : periods.slice(0, parsedPeriod.count);\n },\n [periods, activeVisiblePeriodIndex, parsedPeriod.count],\n );\n const visiblePeriodAnchor = visiblePeriods[0]?.start ?? periodAnchor;\n\n useLayoutEffect(() => {\n const inputChanged = prevInputValueRef.current !== state.inputValue;\n prevInputValueRef.current = state.inputValue;\n\n const selectedKey = getDateValueKey(selected);\n const selectionChanged = prevSelectedKeyRef.current !== selectedKey;\n prevSelectedKeyRef.current = selectedKey;\n\n if (!inputChanged && !selectionChanged) {\n return;\n }\n\n if (selectionChanged && editable) {\n return;\n }\n\n const selectionAnchor = clampDateToBounds(getDateValueAnchor(selected) ?? today, bounds);\n const inputReflectsCalendarSelection = state.inputValue === selectionAnchor.toString();\n const shouldRevealSelection = inputChanged && !inputReflectsCalendarSelection;\n\n if (\n !shouldRevealSelection &&\n isDateInCalendarViewport(\n selectionAnchor,\n periods,\n activeVisiblePeriodIndex,\n parsedPeriod.count,\n )\n ) {\n return;\n }\n\n setPeriodAnchor((current) => (current.equals(selectionAnchor) ? current : selectionAnchor));\n setScrolledVisiblePeriodIndex(null);\n }, [\n activeVisiblePeriodIndex,\n bounds,\n editable,\n parsedPeriod.count,\n periods,\n selected,\n state.inputValue,\n today,\n ]);\n\n function setCalendarPeriodAnchor(date: PlainDate) {\n const clamped = clampDateToBounds(date, bounds);\n setPeriodAnchor(clamped);\n setNavigationAnchor({ date: clamped, inputValue: state.inputValue });\n setPeriodExtensions(getInitialPeriodExtensions(parsedPeriod));\n setScrolledVisiblePeriodIndex(null);\n }\n\n function canMoveCalendar(unit: \"month\" | \"week\", count: number) {\n const target = addCalendarPeriod(visiblePeriodAnchor, unit, count);\n return target.equals(clampDateToBounds(target, bounds));\n }\n\n function canExtendCalendarPeriods(direction: \"before\" | \"after\", windows = 1) {\n if (!bounds) {\n return true;\n }\n\n const extendCount = parsedPeriod.count * windows;\n const firstIndex = periods[0]?.index ?? 0;\n const lastIndex = periods.at(-1)?.index ?? parsedPeriod.count - 1;\n const targetIndex = direction === \"before\" ? firstIndex - extendCount : lastIndex + 1;\n const targetPeriod = getCalendarPeriodAtOffset(periodAnchor, parsedPeriod, weekStartsOn, locale, targetIndex);\n\n return periodIntersectsBounds(targetPeriod, bounds);\n }\n\n const calendarState = useMemo(\n () =>\n ({\n calchemy: state,\n period: parsedPeriod,\n periodAnchor,\n visiblePeriodAnchor,\n today,\n selected,\n periods,\n visiblePeriods,\n weekStartsOn,\n locale,\n bounds,\n namedDates,\n editable,\n isDateDisabled,\n setPeriodAnchor: setCalendarPeriodAnchor,\n setVisiblePeriodIndex(index) {\n setScrolledVisiblePeriodIndex((current) => {\n if (\n current?.anchor === periodAnchorKey &&\n current.inputValue === state.inputValue &&\n current.index === index\n ) {\n return current;\n }\n\n return { anchor: periodAnchorKey, inputValue: state.inputValue, index };\n });\n },\n canMove: canMoveCalendar,\n move(unit, count) {\n if (!canMoveCalendar(unit, count)) {\n return;\n }\n\n const clamped = clampDateToBounds(addCalendarPeriod(visiblePeriodAnchor, unit, count), bounds);\n setPeriodAnchor(clamped);\n setNavigationAnchor({\n date: clamped,\n inputValue: state.inputValue,\n });\n setPeriodExtensions(getInitialPeriodExtensions(parsedPeriod));\n setScrolledVisiblePeriodIndex(null);\n },\n canExtendPeriods: canExtendCalendarPeriods,\n extendPeriods(direction, windows = 1) {\n if (!canExtendCalendarPeriods(direction, windows)) {\n return;\n }\n\n setPeriodExtensions((current) => ({\n ...current,\n [direction]: current[direction] + parsedPeriod.count * windows,\n }));\n },\n selectDate(date) {\n if (!editable) {\n return;\n }\n\n if (state.expectedValue === \"range\") {\n const current = selected;\n if (current?.kind === \"range\" && current.start.equals(current.end)) {\n const start = isBefore(current.start, date) ? current.start : date;\n const end = isBefore(current.start, date) ? date : current.start;\n state.selectDate({ kind: \"range\", start, end });\n return;\n }\n\n state.selectDate({ kind: \"range\", start: date, end: date });\n return;\n }\n\n state.selectDate({ kind: \"single\", date });\n },\n selectValue(value) {\n if (!editable) {\n return;\n }\n\n state.selectDate(value);\n },\n }) satisfies CalendarState,\n [\n state,\n parsedPeriod,\n periodAnchor,\n periodAnchorKey,\n visiblePeriodAnchor,\n today,\n selected,\n periods,\n visiblePeriods,\n weekStartsOn,\n locale,\n bounds,\n namedDates,\n editable,\n isDateDisabled,\n ],\n );\n\n const content = children ?? (\n <>\n <CalendarHeader>\n <CalendarPrevious />\n <CalendarHeading />\n <CalendarNext />\n </CalendarHeader>\n <CalendarWeekdays />\n <CalendarGrid />\n </>\n );\n\n return (\n <CalendarContext.Provider value={calendarState}>\n <div\n {...divProps}\n calchemy-calendar=\"\"\n calchemy-editable={editable ? \"\" : undefined}\n style={\n {\n ...divProps.style,\n \"--calchemy-calendar-period-count\": parsedPeriod.count,\n } as CSSProperties\n }\n >\n {content}\n </div>\n </CalendarContext.Provider>\n );\n}\n\nexport type CalchemyCalendarHeaderProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function CalendarHeader(props: CalchemyCalendarHeaderProps) {\n return <div {...props} calchemy-header=\"\" />;\n}\n\nexport type CalchemyCalendarHeadingProps = ComponentPropsWithoutRef<\"h2\">;\n\nexport function CalendarHeading(props: CalchemyCalendarHeadingProps) {\n const calendar = useCalchemyCalendar();\n\n return (\n <h2 {...props} calchemy-heading=\"\">\n {props.children ?? formatCalendarWindowLabel(calendar.visiblePeriods, calendar.locale)}\n </h2>\n );\n}\n\nexport type CalchemyCalendarNavigationProps = Omit<ComponentPropsWithoutRef<\"button\">, \"onClick\"> & {\n onClick?: ComponentPropsWithoutRef<\"button\">[\"onClick\"];\n};\n\nexport function CalendarPrevious({\n onClick,\n children,\n ...props\n}: CalchemyCalendarNavigationProps) {\n return (\n <CalendarNavigationButton\n {...props}\n direction={-1}\n calchemy-previous=\"\"\n onClick={onClick}\n >\n {children ?? \"Previous\"}\n </CalendarNavigationButton>\n );\n}\n\nexport function CalendarNext({\n onClick,\n children,\n ...props\n}: CalchemyCalendarNavigationProps) {\n return (\n <CalendarNavigationButton\n {...props}\n direction={1}\n calchemy-next=\"\"\n onClick={onClick}\n >\n {children ?? \"Next\"}\n </CalendarNavigationButton>\n );\n}\n\ntype CalendarNavigationButtonProps = CalchemyCalendarNavigationProps & {\n direction: -1 | 1;\n};\n\nfunction CalendarNavigationButton({\n direction,\n onClick,\n type = \"button\",\n ...props\n}: CalendarNavigationButtonProps) {\n const calendar = useCalchemyCalendar();\n const disabled =\n props.disabled ?? !calendar.canMove(calendar.period.unit, calendar.period.count * direction);\n\n function handleClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n calendar.move(calendar.period.unit, calendar.period.count * direction);\n }\n\n return <button {...props} type={type} disabled={disabled} onClick={handleClick} />;\n}\n","import { useMemo } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { useCalchemyCalendar, useCalendarPeriod } from \"./context\";\nimport {\n CalendarDragRectangleOverlay,\n getMultipleDates,\n getSelectedDateKeys,\n mergeCalendarDragPointerProps,\n multipleDragSurfaceStyle,\n toggleDateKeys,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\nimport type { CalendarWeekdayFormat } from \"./types\";\nimport {\n buildCalendarWeeks,\n buildWeekdays,\n getCalendarDayState,\n getFirstVisibleCalendarPeriod,\n} from \"./date-model\";\n\nconst defaultCalendarWeekdayFormat = \"short\" satisfies CalendarWeekdayFormat;\n\nexport type CalchemyCalendarWeekdaysProps = ComponentPropsWithoutRef<\"div\"> & {\n weekdayFormat?: CalendarWeekdayFormat;\n};\n\nexport function CalendarWeekdays({\n weekdayFormat = defaultCalendarWeekdayFormat,\n ...props\n}: CalchemyCalendarWeekdaysProps) {\n const calendar = useCalchemyCalendar();\n const weekdays = buildWeekdays(calendar, weekdayFormat);\n\n return (\n <div {...props} calchemy-days=\"\">\n {weekdays.map((weekday) => (\n <div\n key={weekday.index}\n calchemy-weekday=\"\"\n calchemy-weekend={weekday.weekend ? \"\" : undefined}\n >\n {weekday.label}\n </div>\n ))}\n </div>\n );\n}\n\nexport type CalchemyCalendarGridProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n showBookends?: boolean;\n dragSelection?: boolean;\n};\n\nexport function CalendarGrid({\n showBookends = false,\n dragSelection = true,\n style,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarGridProps) {\n const calendar = useCalchemyCalendar();\n const period = useCalendarPeriod() ?? getFirstVisibleCalendarPeriod(calendar);\n const weeks = buildCalendarWeeks(period, calendar.weekStartsOn);\n const parentDrag = useOptionalCalendarPeriodDrag();\n const localDrag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n );\n const drag = parentDrag ?? localDrag;\n const multipleSelection = Boolean(drag?.multipleSelection);\n const useLocalDragHandlers = Boolean(drag && parentDrag === null);\n const committedSelectedKeys = useMemo(() => new Set(getSelectedDateKeys(calendar.selected)), [calendar.selected]);\n const previewSelectedKeys = drag?.previewSelectedKeys ?? new Set<string>();\n const dragState = drag?.dragState ?? null;\n const dragPointerProps = mergeCalendarDragPointerProps(useLocalDragHandlers, drag, {\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n });\n\n return (\n <div\n {...props}\n calchemy-grid=\"\"\n calchemy-multiple-drag={useLocalDragHandlers ? \"\" : undefined}\n calchemy-dragging={useLocalDragHandlers && dragState ? \"\" : undefined}\n style={useLocalDragHandlers ? { ...multipleDragSurfaceStyle, ...style } : style}\n {...dragPointerProps}\n >\n {useLocalDragHandlers && drag?.dragRectangle ? (\n <CalendarDragRectangleOverlay dragRectangle={drag.dragRectangle} surfaceRef={drag.surfaceRef} />\n ) : null}\n {weeks.map((week) => (\n <div key={week[0]?.toString()} calchemy-week=\"\">\n {week.map((date) => {\n const dayState = getCalendarDayState(calendar, period, date);\n const namedDateLabels = dayState.namedDates.map((item) => item.value).join(\", \");\n const dateKey = date.toString();\n const selected = multipleSelection\n ? dragState\n ? previewSelectedKeys.has(dateKey)\n : committedSelectedKeys.has(dateKey)\n : dayState.selected;\n const dragPreview = Boolean(dragState && selected !== dayState.selected);\n if (dayState.outside && !showBookends) {\n return (\n <div\n key={date.toString()}\n aria-hidden=\"true\"\n calchemy-cell=\"\"\n calchemy-blank=\"\"\n />\n );\n }\n\n return (\n <button\n type=\"button\"\n key={date.toString()}\n ref={(element) =>\n drag?.registerDay(element, date, dayState.disabled || !calendar.editable)\n }\n calchemy-date=\"\"\n calchemy-selected={selected ? \"\" : undefined}\n calchemy-drag-preview={dragPreview ? \"\" : undefined}\n calchemy-drag-preview-selected={dragPreview && selected ? \"\" : undefined}\n calchemy-drag-preview-deselected={dragPreview && !selected ? \"\" : undefined}\n calchemy-today={dayState.today ? \"\" : undefined}\n calchemy-weekend={dayState.weekend ? \"\" : undefined}\n calchemy-outside={dayState.outside ? \"\" : undefined}\n calchemy-first-of-period={dayState.firstOfPeriod ? \"\" : undefined}\n calchemy-last-of-period={dayState.lastOfPeriod ? \"\" : undefined}\n calchemy-disabled={dayState.disabled ? \"\" : undefined}\n calchemy-out-of-bounds={!dayState.bounded ? \"\" : undefined}\n calchemy-named-date={dayState.namedDates.length > 0 ? \"\" : undefined}\n calchemy-holiday={dayState.namedDates.some((item) => item.isHoliday) ? \"\" : undefined}\n calchemy-named-date-labels={namedDateLabels || undefined}\n aria-disabled={!calendar.editable && !dayState.disabled ? true : undefined}\n disabled={dayState.disabled}\n onClick={() => {\n if (!calendar.editable) {\n return;\n }\n\n if (drag?.suppressClickRef.current) {\n drag.suppressClickRef.current = false;\n return;\n }\n if (!dayState.disabled) {\n if (multipleSelection) {\n const selectedDates = getMultipleDates(calendar.selected);\n const nextKeys = toggleDateKeys(\n selectedDates.map((selectedDate) => selectedDate.toString()),\n [dateKey],\n );\n const nextDates = nextKeys.flatMap((key) => {\n if (key === dateKey) {\n return [date];\n }\n\n const existing = selectedDates.find((selectedDate) => selectedDate.toString() === key);\n return existing ? [existing] : [];\n });\n calendar.selectValue({\n kind: \"multiple\",\n dates: nextDates,\n });\n } else {\n calendar.selectDate(date);\n }\n }\n }}\n >\n {date.day}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type PointerEvent,\n type RefObject,\n} from \"react\";\nimport type { DateValue, PlainDate } from \"@calchemy/date-core\";\nimport { useCalchemyCalendar } from \"./context\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\ntype CellBounds = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\ntype DragState = {\n pointerId: number;\n start: Point;\n current: Point;\n baseDates: PlainDate[];\n previewKeys: string[];\n hasMoved: boolean;\n startDayCell: DayCell | null;\n cellBounds: ReadonlyMap<string, CellBounds>;\n};\n\ntype DayCell = {\n date: PlainDate;\n disabled: boolean;\n element: HTMLButtonElement;\n};\n\ntype DragRectangle = {\n start: Point;\n current: Point;\n};\n\nexport type CalendarPeriodDragContextValue = {\n multipleSelection: boolean;\n dragState: DragState | null;\n dragRectangle: DragRectangle | null;\n previewSelectedKeys: ReadonlySet<string>;\n suppressClickRef: RefObject<boolean>;\n surfaceRef: RefObject<HTMLElement | null>;\n registerDay(element: HTMLButtonElement | null, date: PlainDate, disabled: boolean): void;\n handlePointerDownCapture(event: PointerEvent<HTMLElement>): void;\n handlePointerMove(event: PointerEvent<HTMLElement>): void;\n handlePointerUp(event: PointerEvent<HTMLElement>): void;\n handlePointerCancel(event: PointerEvent<HTMLElement>): void;\n};\n\nconst CalendarPeriodDragContext = createContext<CalendarPeriodDragContextValue | null>(null);\n\nexport const multipleDragSurfaceStyle = {\n position: \"relative\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n touchAction: \"none\",\n} as const;\n\nexport const multiplePeriodListDragSurfaceStyle = {\n ...multipleDragSurfaceStyle,\n position: \"relative\",\n background: \"transparent\",\n} as const;\n\nexport type CalendarDragPointerHandlerProps = Pick<\n ComponentPropsWithoutRef<\"div\">,\n \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerUp\" | \"onPointerCancel\" | \"onDragStart\"\n>;\n\n// Example: `mergeCalendarDragPointerProps(true, drag, handlers)` chains drag surface handlers with caller props.\nexport function mergeCalendarDragPointerProps(\n enabled: boolean,\n drag: CalendarPeriodDragContextValue | null | undefined,\n handlers: CalendarDragPointerHandlerProps,\n): CalendarDragPointerHandlerProps {\n if (!enabled || !drag) {\n return handlers;\n }\n\n const { onPointerDownCapture, onPointerMove, onPointerUp, onPointerCancel, onDragStart } = handlers;\n\n return {\n onPointerDownCapture: (event) => {\n drag.handlePointerDownCapture(event);\n onPointerDownCapture?.(event);\n },\n onPointerMove: (event) => {\n drag.handlePointerMove(event);\n onPointerMove?.(event);\n },\n onPointerUp: (event) => {\n drag.handlePointerUp(event);\n onPointerUp?.(event);\n },\n onPointerCancel: (event) => {\n drag.handlePointerCancel(event);\n onPointerCancel?.(event);\n },\n onDragStart: (event) => {\n event.preventDefault();\n onDragStart?.(event);\n },\n };\n}\n\nexport function useOptionalCalendarPeriodDrag(): CalendarPeriodDragContextValue | null {\n return useContext(CalendarPeriodDragContext);\n}\n\nexport function useCalendarPeriodDragSurface(\n dragSelection = true,\n surfaceElementRef?: RefObject<HTMLElement | null>,\n): CalendarPeriodDragContextValue | null {\n const calendar = useCalchemyCalendar();\n const multipleSelection = dragSelection && calendar.calchemy.expectedValue === \"multiple\";\n const surfaceRef = useRef<HTMLElement | null>(null);\n const dayCells = useRef(new Map<string, DayCell>());\n const suppressClickRef = useRef(false);\n const dragStateRef = useRef<DragState | null>(null);\n const dragPreviewFrameRef = useRef<number | null>(null);\n const dragGestureCleanupRef = useRef<(() => void) | null>(null);\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragRectangle, setDragRectangle] = useState<DragRectangle | null>(null);\n const previewSelectedKeys = useMemo(\n () => new Set(dragState?.previewKeys ?? []),\n [dragState],\n );\n\n const acquireDragGestureLock = useCallback(() => {\n if (dragGestureCleanupRef.current || typeof document === \"undefined\") {\n return;\n }\n\n const preventGestureDefault = (event: Event) => {\n event.preventDefault();\n };\n\n const clearDocumentSelection = () => {\n document.getSelection()?.removeAllRanges();\n };\n\n const previousBodyUserSelect = document.body.style.userSelect;\n const previousDocumentUserSelect = document.documentElement.style.userSelect;\n document.body.style.userSelect = \"none\";\n document.documentElement.style.userSelect = \"none\";\n\n document.addEventListener(\"pointermove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"touchmove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"wheel\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.addEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n clearDocumentSelection();\n\n dragGestureCleanupRef.current = () => {\n document.removeEventListener(\"pointermove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"touchmove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"wheel\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n document.body.style.userSelect = previousBodyUserSelect;\n document.documentElement.style.userSelect = previousDocumentUserSelect;\n clearDocumentSelection();\n dragGestureCleanupRef.current = null;\n };\n }, []);\n\n const releaseDragGestureLock = useCallback(() => {\n dragGestureCleanupRef.current?.();\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n }\n }, []);\n\n const scheduleDragPreviewUpdate = useCallback((nextDragState: DragState) => {\n dragStateRef.current = nextDragState;\n if (dragPreviewFrameRef.current !== null) {\n return;\n }\n\n dragPreviewFrameRef.current = requestAnimationFrame(() => {\n setDragState(dragStateRef.current);\n dragPreviewFrameRef.current = null;\n });\n }, []);\n\n const registerDay = useCallback((element: HTMLButtonElement | null, date: PlainDate, disabled: boolean) => {\n const key = date.toString();\n if (element) {\n dayCells.current.set(key, { date, disabled, element });\n return;\n }\n\n dayCells.current.delete(key);\n }, []);\n\n const getDayCellFromTarget = useCallback((target: EventTarget | null): DayCell | null => {\n if (!(target instanceof Element)) {\n return null;\n }\n\n const button = target.closest(\"[calchemy-date]\");\n if (!(button instanceof HTMLButtonElement)) {\n return null;\n }\n\n for (const cell of dayCells.current.values()) {\n if (cell.element === button) {\n return cell;\n }\n }\n\n return null;\n }, []);\n\n const commitMultipleSelection = useCallback(\n (keys: Iterable<string>, fallbackDates: readonly PlainDate[] = []) => {\n const dates = resolveDateKeys(keys, dayCells.current, fallbackDates);\n calendar.selectValue({\n kind: \"multiple\",\n dates,\n });\n },\n [calendar],\n );\n\n const endDragGesture = useCallback(\n (pointerId?: number) => {\n if (pointerId !== undefined) {\n surfaceRef.current?.releasePointerCapture?.(pointerId);\n }\n\n releaseDragGestureLock();\n dragStateRef.current = null;\n setDragState(null);\n setDragRectangle(null);\n },\n [releaseDragGestureLock],\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n event.preventDefault();\n const current = getPointerPoint(event);\n setDragRectangle({ start: activeDrag.start, current });\n const dragRect = getDragRect(activeDrag.start, current);\n const clipRect = getDragClipRect(surfaceRef.current);\n const gestureKeys = getIntersectingDateKeys(\n dayCells.current,\n dragRect,\n activeDrag.cellBounds,\n clipRect,\n );\n const baseKeys = activeDrag.baseDates.map((date) => date.toString());\n const previewKeys = toggleDateKeys(baseKeys, gestureKeys);\n const hasMoved = activeDrag.hasMoved || hasPointerMoved(activeDrag.start, current);\n scheduleDragPreviewUpdate({\n ...activeDrag,\n current,\n previewKeys,\n hasMoved,\n });\n },\n [multipleSelection, scheduleDragPreviewUpdate],\n );\n\n const handlePointerDownCapture = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n if (!multipleSelection || event.button !== 0 || !event.isPrimary) {\n return;\n }\n\n const baseDates = getMultipleDates(calendar.selected);\n event.preventDefault();\n\n if (typeof document !== \"undefined\") {\n document.getSelection()?.removeAllRanges();\n }\n\n surfaceRef.current = surfaceElementRef?.current ?? event.currentTarget;\n surfaceRef.current?.setPointerCapture?.(event.pointerId);\n acquireDragGestureLock();\n const nextDragState: DragState = {\n pointerId: event.pointerId,\n start: getPointerPoint(event),\n current: getPointerPoint(event),\n baseDates,\n previewKeys: baseDates.map((selectedDate) => selectedDate.toString()),\n hasMoved: false,\n startDayCell: getDayCellFromTarget(event.target),\n cellBounds: snapshotCellBounds(dayCells.current),\n };\n dragStateRef.current = nextDragState;\n setDragState(nextDragState);\n setDragRectangle({\n start: nextDragState.start,\n current: nextDragState.current,\n });\n },\n [acquireDragGestureLock, calendar.selected, getDayCellFromTarget, multipleSelection, surfaceElementRef],\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n setDragState(activeDrag);\n }\n\n event.preventDefault();\n\n suppressClickRef.current = true;\n setTimeout(() => {\n suppressClickRef.current = false;\n }, 0);\n\n if (activeDrag.hasMoved) {\n commitMultipleSelection(activeDrag.previewKeys, activeDrag.baseDates);\n } else {\n const dayCell = activeDrag.startDayCell;\n if (dayCell && !dayCell.disabled) {\n const selectedDates = getMultipleDates(calendar.selected);\n const nextKeys = toggleDateKeys(\n selectedDates.map((selectedDate) => selectedDate.toString()),\n [dayCell.date.toString()],\n );\n commitMultipleSelection(nextKeys, selectedDates.concat(dayCell.date));\n }\n }\n\n endDragGesture(event.pointerId);\n\n const focused = document.activeElement;\n if (focused instanceof HTMLElement && event.currentTarget.contains(focused)) {\n focused.blur();\n }\n },\n [calendar.selected, commitMultipleSelection, endDragGesture, getDayCellFromTarget, multipleSelection],\n );\n\n const handlePointerCancel = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n endDragGesture(event.pointerId);\n },\n [endDragGesture],\n );\n\n return useMemo(() => {\n if (!multipleSelection) {\n return null;\n }\n\n return {\n multipleSelection,\n dragState,\n dragRectangle,\n previewSelectedKeys,\n suppressClickRef,\n surfaceRef,\n registerDay,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n };\n }, [\n dragRectangle,\n dragState,\n handlePointerCancel,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n multipleSelection,\n previewSelectedKeys,\n registerDay,\n ]);\n}\n\nexport type CalendarDragRectangleOverlayProps = {\n dragRectangle?: DragRectangle | null;\n surfaceRef?: RefObject<HTMLElement | null>;\n};\n\nexport function CalendarDragRectangleOverlay({\n dragRectangle: dragRectangleProp,\n surfaceRef: surfaceRefProp,\n}: CalendarDragRectangleOverlayProps = {}) {\n const drag = useOptionalCalendarPeriodDrag();\n const dragRectangle = dragRectangleProp ?? drag?.dragRectangle ?? null;\n const surfaceRef = surfaceRefProp ?? drag?.surfaceRef;\n\n if (!dragRectangle) {\n return null;\n }\n\n const surface = surfaceRef?.current;\n if (!surface) {\n return null;\n }\n\n const surfaceRect = surface.getBoundingClientRect();\n const left = Math.min(dragRectangle.start.x, dragRectangle.current.x) - surfaceRect.left;\n const top = Math.min(dragRectangle.start.y, dragRectangle.current.y) - surfaceRect.top;\n const width = Math.abs(dragRectangle.current.x - dragRectangle.start.x);\n const height = Math.abs(dragRectangle.current.y - dragRectangle.start.y);\n\n return (\n <div\n aria-hidden=\"true\"\n calchemy-drag-rect=\"\"\n style={{\n position: \"absolute\",\n left,\n top,\n width,\n height,\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n );\n}\n\nexport type CalendarPeriodDragProviderProps = {\n value: CalendarPeriodDragContextValue;\n children: React.ReactNode;\n};\n\nexport function CalendarPeriodDragProvider({ value, children }: CalendarPeriodDragProviderProps) {\n return (\n <CalendarPeriodDragContext.Provider value={value}>{children}</CalendarPeriodDragContext.Provider>\n );\n}\n\nexport function getMultipleDates(value: DateValue | null): PlainDate[] {\n return value?.kind === \"multiple\" ? value.dates : [];\n}\n\nexport function getSelectedDateKeys(value: DateValue | null): string[] {\n return getMultipleDates(value).map((date) => date.toString());\n}\n\nexport function toggleDateKeys(baseKeys: readonly string[], toggledKeys: readonly string[]): string[] {\n const next = new Set(baseKeys);\n for (const key of toggledKeys) {\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n }\n\n return Array.from(next).sort();\n}\n\nfunction getPointerPoint(event: Pick<PointerEvent, \"clientX\" | \"clientY\">): Point {\n return { x: event.clientX, y: event.clientY };\n}\n\nfunction hasPointerMoved(start: Point, current: Point): boolean {\n return Math.abs(start.x - current.x) > 2 || Math.abs(start.y - current.y) > 2;\n}\n\nfunction getDragRect(start: Point, current: Point): DOMRect {\n const left = Math.min(start.x, current.x);\n const right = Math.max(start.x, current.x);\n const top = Math.min(start.y, current.y);\n const bottom = Math.max(start.y, current.y);\n\n return {\n left,\n right,\n top,\n bottom,\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n toJSON: () => ({}),\n } as DOMRect;\n}\n\nfunction snapshotCellBounds(cells: ReadonlyMap<string, DayCell>): Map<string, CellBounds> {\n const bounds = new Map<string, CellBounds>();\n for (const [key, cell] of cells) {\n const rect = cell.element.getBoundingClientRect();\n bounds.set(key, {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n });\n }\n\n return bounds;\n}\n\nfunction getDragClipRect(surface: HTMLElement | null): CellBounds | null {\n if (!surface) {\n return null;\n }\n\n const scrollContainer = surface.closest(\"[calchemy-scroll]\");\n if (!(scrollContainer instanceof HTMLElement)) {\n return null;\n }\n\n const rect = scrollContainer.getBoundingClientRect();\n\n return {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n };\n}\n\nfunction clipBoundsToRect(\n bounds: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n clip: CellBounds,\n): CellBounds | null {\n const left = Math.max(bounds.left, clip.left);\n const right = Math.min(bounds.right, clip.right);\n const top = Math.max(bounds.top, clip.top);\n const bottom = Math.min(bounds.bottom, clip.bottom);\n\n if (left > right || top > bottom) {\n return null;\n }\n\n return { left, right, top, bottom };\n}\n\nfunction getIntersectingDateKeys(\n cells: ReadonlyMap<string, DayCell>,\n dragRect: DOMRect,\n cellBounds: ReadonlyMap<string, CellBounds>,\n clipRect: CellBounds | null = null,\n): string[] {\n const clippedDragRect = clipRect ? clipBoundsToRect(dragRect, clipRect) : dragRect;\n if (!clippedDragRect) {\n return [];\n }\n\n return Array.from(cells.entries())\n .filter(([key, cell]) => {\n const bounds = cellBounds.get(key);\n if (!bounds || cell.disabled) {\n return false;\n }\n\n const visibleBounds = clipRect ? clipBoundsToRect(bounds, clipRect) : bounds;\n return visibleBounds && rectsIntersect(clippedDragRect, visibleBounds);\n })\n .map(([key]) => key);\n}\n\nfunction rectsIntersect(\n left: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n right: CellBounds,\n): boolean {\n return left.left <= right.right && left.right >= right.left && left.top <= right.bottom && left.bottom >= right.top;\n}\n\nfunction resolveDateKeys(\n keys: Iterable<string>,\n cells: ReadonlyMap<string, DayCell>,\n fallbackDates: readonly PlainDate[],\n): PlainDate[] {\n const fallbackByKey = new Map(fallbackDates.map((date) => [date.toString(), date]));\n return Array.from(keys)\n .sort()\n .flatMap((key) => {\n const date = cells.get(key)?.date ?? fallbackByKey.get(key);\n return date ? [date] : [];\n });\n}\n","import type {\n DateOrder,\n DateValue,\n NamedDatesVocabularyEntry,\n PlainDate,\n WeekdayIndex,\n} from \"@calchemy/date-core\";\nimport type { CalchemyState } from \"../../hooks/useCalchemy\";\nimport type {\n CalendarBounds,\n CalendarDayState,\n CalendarDuration,\n CalendarPeriodModel,\n CalendarPeriodUnit,\n CalendarState,\n CalendarWeekdayFormat,\n ParsedCalendarPeriod,\n} from \"./types\";\n\nconst defaultDateOrderPreference: DateOrder[] = [\"DMY\", \"MDY\", \"YMD\"];\ntype NamedDateResolveContext = Parameters<NamedDatesVocabularyEntry[\"resolveDate\"]>[0][\"context\"];\n\nexport function getFirstVisibleCalendarPeriod(calendar: CalendarState): CalendarPeriodModel {\n const period = calendar.visiblePeriods[0];\n if (!period) {\n throw new Error(\"Calchemy.Calendar requires at least one visible generated period.\");\n }\n\n return period;\n}\n\nexport function getCalendarDayState(\n calendar: CalendarState,\n period: CalendarPeriodModel,\n date: PlainDate,\n): CalendarDayState {\n const bounded = isDateWithinBounds(date, calendar.bounds);\n const namedDates = getNamedDatesForDate(calendar, date);\n const disabled =\n !bounded || (calendar.isDateDisabled?.(date, calendar) ?? false);\n\n return {\n outside: isBefore(date, period.start) || isAfter(date, period.end),\n selected: isSelectedDate(calendar.selected, date),\n today: calendar.today.equals(date),\n weekend: isWeekend(date),\n firstOfPeriod: date.equals(period.start),\n lastOfPeriod: date.equals(period.end),\n bounded,\n disabled,\n namedDates,\n };\n}\n\nexport function parseCalendarDuration(value: CalendarDuration, propName: string): ParsedCalendarPeriod {\n const hasMonths = \"months\" in value;\n const hasWeeks = \"weeks\" in value;\n if (hasMonths === hasWeeks) {\n throw new Error(`Calchemy.Calendar ${propName} must include exactly one of months or weeks.`);\n }\n\n const count = hasMonths ? value.months : value.weeks;\n if (!Number.isInteger(count) || count < 1) {\n throw new Error(`Calchemy.Calendar ${propName} must be a positive integer duration.`);\n }\n\n return {\n unit: hasMonths ? \"month\" : \"week\",\n count,\n };\n}\n\nexport function validateCalendarBounds(bounds: CalendarBounds | undefined): void {\n if (bounds?.start && bounds.end && isAfter(bounds.start, bounds.end)) {\n throw new Error(\"Calchemy.Calendar bounds.start must be on or before bounds.end.\");\n }\n}\n\nexport function clampDateToBounds(date: PlainDate, bounds: CalendarBounds | undefined): PlainDate {\n if (bounds?.start && isBefore(date, bounds.start)) {\n return bounds.start;\n }\n if (bounds?.end && isAfter(date, bounds.end)) {\n return bounds.end;\n }\n\n return date;\n}\n\nfunction isDateWithinBounds(date: PlainDate, bounds: CalendarBounds | undefined): boolean {\n return (!bounds?.start || !isBefore(date, bounds.start)) && (!bounds?.end || !isAfter(date, bounds.end));\n}\n\nexport function periodIntersectsBounds(period: CalendarPeriodModel, bounds: CalendarBounds | undefined): boolean {\n return (!bounds?.start || !isBefore(period.end, bounds.start)) && (!bounds?.end || !isAfter(period.start, bounds.end));\n}\n\nexport function getCalendarPeriodAtOffset(\n anchor: PlainDate,\n period: ParsedCalendarPeriod,\n weekStartsOn: WeekdayIndex,\n locale: string,\n offset: number,\n): CalendarPeriodModel {\n const firstStart = period.unit === \"month\" ? startOfMonth(anchor) : startOfWeek(anchor, weekStartsOn);\n const start = addCalendarPeriod(firstStart, period.unit, offset);\n const end = period.unit === \"month\" ? endOfMonth(start) : start.add({ days: 6 });\n\n return {\n id: `${period.unit}-${start.toString()}`,\n unit: period.unit,\n index: offset,\n start,\n end,\n label: formatPeriodLabel(start, end, period.unit, locale),\n };\n}\n\nexport function getInitialPeriodExtensions(period: ParsedCalendarPeriod): { before: number; after: number } {\n return {\n before: period.count * 6,\n after: period.count * 3,\n };\n}\n\nexport function getSelectedValue(state: CalchemyState): DateValue | null {\n const resultValue = getResultValue(state);\n return state.value ?? resultValue;\n}\n\nexport function getDateValueAnchor(value: DateValue | null): PlainDate | null {\n if (!value) {\n return null;\n }\n\n switch (value.kind) {\n case \"single\":\n return value.date;\n case \"range\":\n return value.start;\n case \"multiple\":\n return value.dates[0] ?? null;\n }\n}\n\nexport function getDateValueKey(value: DateValue | null): string {\n if (!value) {\n return \"\";\n }\n\n switch (value.kind) {\n case \"single\":\n return `single:${value.date.toString()}`;\n case \"range\":\n return `range:${value.start.toString()}:${value.end.toString()}`;\n case \"multiple\":\n return `multiple:${value.dates.map((date) => date.toString()).join(\",\")}`;\n }\n}\n\nexport function isDateInCalendarViewport(\n date: PlainDate,\n periods: readonly CalendarPeriodModel[],\n visiblePeriodIndex: number,\n windowCount: number,\n): boolean {\n return periods\n .filter(\n (period) =>\n period.index >= visiblePeriodIndex && period.index < visiblePeriodIndex + windowCount,\n )\n .some((period) => !isBefore(date, period.start) && !isAfter(date, period.end));\n}\n\nfunction getResultValue(state: CalchemyState): DateValue | null {\n return state.result.status === \"valid\" ? state.result.value : null;\n}\n\nexport function getToday(state: CalchemyState): PlainDate {\n if (state.parseContext?.referenceDate) {\n return state.parseContext.referenceDate;\n }\n\n const todayResult = state.calchemy.parseDate(\"today\", state.parseContext);\n if (todayResult.status === \"valid\" && todayResult.value.kind === \"single\") {\n return todayResult.value.date;\n }\n\n return state.calchemy.Temporal.Now.plainDateISO(state.parseContext?.timeZone);\n}\n\nexport function buildCalendarPeriods(\n anchor: PlainDate,\n period: ParsedCalendarPeriod,\n weekStartsOn: WeekdayIndex,\n locale: string,\n extensions: { before: number; after: number },\n bounds?: CalendarBounds,\n): CalendarPeriodModel[] {\n const total = extensions.before + period.count + extensions.after;\n\n return Array.from({ length: total }, (_, index) => {\n const offset = index - extensions.before;\n return getCalendarPeriodAtOffset(anchor, period, weekStartsOn, locale, offset);\n }).filter((item) => periodIntersectsBounds(item, bounds));\n}\n\nexport function buildCalendarWeeks(period: CalendarPeriodModel, weekStartsOn: WeekdayIndex): PlainDate[][] {\n const start = startOfWeek(period.start, weekStartsOn);\n const end = endOfWeek(period.end, weekStartsOn);\n const weeks: PlainDate[][] = [];\n let cursor = start;\n\n while (!isAfter(cursor, end)) {\n const week = Array.from({ length: 7 }, (_, index) => cursor.add({ days: index }));\n weeks.push(week);\n cursor = cursor.add({ days: 7 });\n }\n\n return weeks;\n}\n\nexport function buildWeekdays(\n calendar: CalendarState,\n weekdayFormat: CalendarWeekdayFormat = \"short\",\n): Array<{ index: number; label: string; weekend: boolean }> {\n const sunday = startOfWeek(calendar.today, 0);\n const first = startOfWeek(calendar.today, calendar.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) => {\n const date = first.add({ days: index });\n const weekdayIndex = sunday.until(date).days % 7;\n return {\n index: weekdayIndex,\n label: date.toLocaleString(calendar.locale, { weekday: weekdayFormat }),\n weekend: isWeekend(date),\n };\n });\n}\n\nexport function addCalendarPeriod(date: PlainDate, unit: CalendarPeriodUnit, count: number): PlainDate {\n return unit === \"month\" ? date.add({ months: count }) : date.add({ weeks: count });\n}\n\nexport function formatCalendarWindowLabel(periods: CalendarPeriodModel[], locale: string): string {\n const first = periods[0];\n const last = periods.at(-1);\n if (!first || !last) {\n return \"\";\n }\n if (first.start.equals(last.start) && first.end.equals(last.end)) {\n return first.label;\n }\n\n return `${formatDateLabel(first.start, locale)} - ${formatDateLabel(last.end, locale)}`;\n}\n\nexport function formatMonthLabel(date: PlainDate, locale: string): string {\n return date.toLocaleString(locale, { month: \"long\" });\n}\n\nfunction startOfMonth(date: PlainDate): PlainDate {\n return date.with({ day: 1 });\n}\n\nfunction endOfMonth(date: PlainDate): PlainDate {\n return startOfMonth(date).add({ months: 1 }).subtract({ days: 1 });\n}\n\nfunction startOfWeek(date: PlainDate, weekStartsOn: WeekdayIndex): PlainDate {\n const temporalWeekday = weekStartsOn === 0 ? 7 : weekStartsOn;\n let cursor = date;\n\n while (cursor.dayOfWeek !== temporalWeekday) {\n cursor = cursor.subtract({ days: 1 });\n }\n\n return cursor;\n}\n\nfunction endOfWeek(date: PlainDate, weekStartsOn: WeekdayIndex): PlainDate {\n return startOfWeek(date, weekStartsOn).add({ days: 6 });\n}\n\nexport function isBefore(left: PlainDate, right: PlainDate): boolean {\n return left.toString() < right.toString();\n}\n\nexport function isAfter(left: PlainDate, right: PlainDate): boolean {\n return left.toString() > right.toString();\n}\n\nfunction isSelectedDate(value: DateValue | null, date: PlainDate): boolean {\n if (!value) {\n return false;\n }\n\n switch (value.kind) {\n case \"single\":\n return value.date.equals(date);\n case \"range\":\n return !isBefore(date, value.start) && !isAfter(date, value.end);\n case \"multiple\":\n return value.dates.some((selectedDate) => selectedDate.equals(date));\n }\n}\n\nfunction isWeekend(date: PlainDate): boolean {\n return date.dayOfWeek === 6 || date.dayOfWeek === 7;\n}\n\nfunction getNamedDatesForDate(calendar: CalendarState, date: PlainDate) {\n if (!calendar.namedDates) {\n return [];\n }\n\n const context = getResolvedNamedDateContext(calendar);\n return calendar.calchemy.calchemy.namedDatesVocabulary.filter((entry) => {\n if (calendar.namedDates === \"holidays\" && !entry.isHoliday) {\n return false;\n }\n\n return entry.resolveDate({ year: date.year, context })?.equals(date) ?? false;\n });\n}\n\nfunction getResolvedNamedDateContext(calendar: CalendarState): NamedDateResolveContext {\n const context = calendar.calchemy.parseContext;\n\n return {\n referenceDate:\n context?.referenceDate ??\n calendar.calchemy.calchemy.Temporal.Now.plainDateISO(context?.timeZone),\n locale: context?.locale ?? \"en-US\",\n weekStartsOn: context?.weekStartsOn ?? 0,\n dateOrderPreference: normalizeDateOrderPreference(context?.dateOrderPreference),\n lastNDaysIncludesToday: context?.lastNDaysIncludesToday ?? true,\n };\n}\n\nfunction normalizeDateOrderPreference(value: DateOrder[] | undefined): DateOrder[] {\n if (!value || value.length === 0) {\n return defaultDateOrderPreference;\n }\n\n return Array.from(new Set(value));\n}\n\nfunction formatPeriodLabel(start: PlainDate, end: PlainDate, unit: CalendarPeriodUnit, locale: string): string {\n if (unit === \"month\") {\n return formatDateLabel(start, locale);\n }\n\n return `${start.toLocaleString(locale, { month: \"short\", day: \"numeric\" })} - ${end.toLocaleString(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}`;\n}\n\nfunction formatDateLabel(date: PlainDate, locale: string): string {\n return date.toLocaleString(locale, { month: \"long\", year: \"numeric\" });\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { useCalchemyCalendar, useCalendarPeriod } from \"./context\";\nimport { getFirstVisibleCalendarPeriod } from \"./date-model\";\n\nexport type CalchemyCalendarPeriodHeadingProps = ComponentPropsWithoutRef<\"h3\">;\n\nexport function CalendarPeriodHeading(props: CalchemyCalendarPeriodHeadingProps) {\n const calendar = useCalchemyCalendar();\n const period = useCalendarPeriod() ?? getFirstVisibleCalendarPeriod(calendar);\n\n return (\n <h3 {...props} calchemy-period-heading=\"\">\n {props.children ?? period.label}\n </h3>\n );\n}\n","import { useContext } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { CalendarPeriodContext, useCalchemyCalendar } from \"./context\";\nimport {\n CalendarDragRectangleOverlay,\n CalendarPeriodDragProvider,\n mergeCalendarDragPointerProps,\n multipleDragSurfaceStyle,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\n\nexport type CalchemyCalendarPeriodProps = ComponentPropsWithoutRef<\"section\"> & {\n dragSelection?: boolean;\n};\n\nexport function CalendarPeriod({\n dragSelection = true,\n style,\n children,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarPeriodProps) {\n const period = useContext(CalendarPeriodContext);\n const calendar = useCalchemyCalendar();\n const parentDrag = useOptionalCalendarPeriodDrag();\n const drag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n );\n\n const content = drag ? (\n <CalendarPeriodDragProvider value={drag}>\n <CalendarDragRectangleOverlay />\n {children}\n </CalendarPeriodDragProvider>\n ) : (\n children\n );\n const dragPointerProps = mergeCalendarDragPointerProps(Boolean(drag), drag, {\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n });\n\n return (\n <section\n {...props}\n calchemy-period=\"\"\n calchemy-period-id={period?.id}\n calchemy-period-index={period?.index}\n calchemy-multiple-drag={drag ? \"\" : undefined}\n calchemy-dragging={drag?.dragState ? \"\" : undefined}\n style={\n drag\n ? { ...multipleDragSurfaceStyle, ...style }\n : parentDrag\n ? { touchAction: \"none\", ...style }\n : style\n }\n {...dragPointerProps}\n >\n {content}\n </section>\n );\n}\n","import { useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { CalendarPeriodContext, CalendarScrollContext, useCalchemyCalendar } from \"./context\";\nimport { CalendarGrid, CalendarWeekdays } from \"./CalendarGrid\";\nimport { CalendarPeriodHeading } from \"./CalendarPeriodHeading\";\nimport { CalendarPeriod } from \"./CalendarPeriod\";\nimport {\n CalendarDragRectangleOverlay,\n CalendarPeriodDragProvider,\n mergeCalendarDragPointerProps,\n multiplePeriodListDragSurfaceStyle,\n useCalendarPeriodDragSurface,\n useOptionalCalendarPeriodDrag,\n} from \"./calendar-period-drag\";\n\nexport type CalchemyCalendarPeriodListProps = ComponentPropsWithoutRef<\"div\"> & {\n dragSelection?: boolean;\n};\n\nexport function CalendarPeriodList({\n children,\n dragSelection = true,\n style,\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n ...props\n}: CalchemyCalendarPeriodListProps) {\n const calendar = useCalchemyCalendar();\n const scrollContext = useContext(CalendarScrollContext);\n const parentDrag = useOptionalCalendarPeriodDrag();\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const hitCaptureRef = useRef<HTMLDivElement | null>(null);\n const drag = useCalendarPeriodDragSurface(\n calendar.editable && dragSelection && parentDrag === null,\n surfaceRef,\n );\n const periods = scrollContext ? calendar.periods : calendar.visiblePeriods;\n\n useLayoutEffect(() => {\n if (!drag) {\n return;\n }\n\n const surface = surfaceRef.current;\n const hitCapture = hitCaptureRef.current;\n if (!surface || !hitCapture) {\n return;\n }\n\n const updateDragHitBounds = () => {\n const periodElements = surface.querySelectorAll<HTMLElement>(\"[calchemy-period]\");\n if (periodElements.length === 0) {\n hitCapture.style.removeProperty(\"inline-size\");\n hitCapture.style.removeProperty(\"block-size\");\n return;\n }\n\n let maxInlineEnd = 0;\n let maxBlockEnd = 0;\n for (const periodElement of periodElements) {\n maxInlineEnd = Math.max(maxInlineEnd, periodElement.offsetLeft + periodElement.offsetWidth);\n maxBlockEnd = Math.max(maxBlockEnd, periodElement.offsetTop + periodElement.offsetHeight);\n }\n\n hitCapture.style.inlineSize = `${maxInlineEnd}px`;\n hitCapture.style.blockSize = `${maxBlockEnd}px`;\n };\n\n updateDragHitBounds();\n\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const resizeObserver = new ResizeObserver(updateDragHitBounds);\n resizeObserver.observe(surface);\n for (const periodElement of surface.querySelectorAll<HTMLElement>(\"[calchemy-period]\")) {\n resizeObserver.observe(periodElement);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [drag, periods]);\n\n const spacerStyle =\n scrollContext?.direction === \"horizontal\"\n ? { gridColumn: `span ${scrollContext.leadingSpacerPeriodCount}` }\n : { blockSize: `${scrollContext?.leadingSpacerPixelSize ?? 0}px` };\n\n const periodContent = (\n <>\n {scrollContext && scrollContext.leadingSpacerPeriodCount > 0 ? (\n <div\n aria-hidden=\"true\"\n calchemy-scroll-spacer=\"\"\n style={spacerStyle}\n />\n ) : null}\n {periods.map((period) => (\n <CalendarPeriodContext.Provider key={period.id} value={period}>\n {children ?? (\n <CalendarPeriod>\n <CalendarPeriodHeading />\n <CalendarWeekdays />\n <CalendarGrid />\n </CalendarPeriod>\n )}\n </CalendarPeriodContext.Provider>\n ))}\n </>\n );\n\n const content = drag ? (\n <CalendarPeriodDragProvider value={drag}>\n <div\n ref={hitCaptureRef}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n pointerEvents: \"auto\",\n touchAction: \"none\",\n }}\n />\n <CalendarDragRectangleOverlay />\n {periodContent}\n </CalendarPeriodDragProvider>\n ) : (\n periodContent\n );\n const dragPointerProps = mergeCalendarDragPointerProps(Boolean(drag), drag, {\n onPointerDownCapture,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onDragStart,\n });\n\n return (\n <div\n {...props}\n ref={surfaceRef}\n calchemy-period-list=\"\"\n calchemy-multiple-drag={drag ? \"\" : undefined}\n calchemy-dragging={drag?.dragState ? \"\" : undefined}\n style={drag ? { ...multiplePeriodListDragSurfaceStyle, ...style } : style}\n {...dragPointerProps}\n >\n {content}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ChangeEvent } from \"react\";\nimport { useCalchemyCalendar } from \"./context\";\nimport { formatMonthLabel, isAfter, isBefore } from \"./date-model\";\n\nexport type CalchemyCalendarMonthSelectProps = Omit<ComponentPropsWithoutRef<\"select\">, \"value\" | \"onChange\"> & {\n onChange?: ComponentPropsWithoutRef<\"select\">[\"onChange\"];\n};\n\nexport function CalendarMonthSelect({ onChange, ...props }: CalchemyCalendarMonthSelectProps) {\n const calendar = useCalchemyCalendar();\n const months = Array.from({ length: 12 }, (_, index) => index + 1).filter((month) =>\n isMonthWithinBounds(calendar.visiblePeriodAnchor.with({ month, day: 1 }), calendar),\n );\n\n return (\n <select\n {...props}\n calchemy-month-select=\"\"\n value={String(calendar.visiblePeriodAnchor.month)}\n onChange={(event) =>\n handleCalendarSelectChange(event, onChange, (value) =>\n calendar.setPeriodAnchor(calendar.visiblePeriodAnchor.with({ month: value, day: 1 })),\n )\n }\n >\n {months.map((month) => {\n const date = calendar.visiblePeriodAnchor.with({ month, day: 1 });\n return (\n <option key={month} value={String(month)}>\n {formatMonthLabel(date, calendar.locale)}\n </option>\n );\n })}\n </select>\n );\n}\n\nexport type CalchemyCalendarYearSelectProps = Omit<ComponentPropsWithoutRef<\"select\">, \"value\" | \"onChange\"> & {\n startYear?: number;\n endYear?: number;\n onChange?: ComponentPropsWithoutRef<\"select\">[\"onChange\"];\n};\n\nexport function CalendarYearSelect({ startYear, endYear, onChange, ...props }: CalchemyCalendarYearSelectProps) {\n const calendar = useCalchemyCalendar();\n const visibleYear = calendar.visiblePeriodAnchor.year;\n const firstYear = Math.min(calendar.bounds?.start?.year ?? startYear ?? visibleYear - 100, visibleYear);\n const lastYear = Math.max(calendar.bounds?.end?.year ?? endYear ?? visibleYear + 100, visibleYear);\n\n return (\n <select\n {...props}\n calchemy-year-select=\"\"\n value={String(visibleYear)}\n onChange={(event) =>\n handleCalendarSelectChange(event, onChange, (value) =>\n calendar.setPeriodAnchor(calendar.visiblePeriodAnchor.with({ year: value, day: 1 })),\n )\n }\n >\n {Array.from({ length: lastYear - firstYear + 1 }, (_, index) => firstYear + index).map((year) => (\n <option key={year} value={String(year)}>\n {year}\n </option>\n ))}\n </select>\n );\n}\n\nfunction handleCalendarSelectChange(\n event: ChangeEvent<HTMLSelectElement>,\n onChange: ComponentPropsWithoutRef<\"select\">[\"onChange\"] | undefined,\n updatePeriodAnchor: (value: number) => void,\n): void {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n updatePeriodAnchor(Number(event.currentTarget.value));\n}\n\nfunction isMonthWithinBounds(\n monthStart: ReturnType<typeof useCalchemyCalendar>[\"visiblePeriodAnchor\"],\n calendar: ReturnType<typeof useCalchemyCalendar>,\n): boolean {\n const monthEnd = monthStart.add({ months: 1 }).subtract({ days: 1 });\n\n return (\n (!calendar.bounds?.start || !isBefore(monthEnd, calendar.bounds.start)) &&\n (!calendar.bounds?.end || !isAfter(monthStart, calendar.bounds.end))\n );\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { CalchemyContext, useCalchemyContext } from \"./calendar/context\";\nimport { useCalchemy, type UseCalchemyOptions } from \"../hooks/useCalchemy\";\nimport {\n Calendar,\n CalendarHeader,\n CalendarHeading,\n CalendarNext,\n CalendarPrevious,\n} from \"./calendar/Calendar\";\nimport { CalendarGrid, CalendarWeekdays } from \"./calendar/CalendarGrid\";\nimport { CalendarPeriodHeading } from \"./calendar/CalendarPeriodHeading\";\nimport { CalendarPeriod } from \"./calendar/CalendarPeriod\";\nimport { CalendarPeriodList } from \"./calendar/CalendarPeriodList\";\nimport {\n CalendarMonthSelect,\n CalendarYearSelect,\n} from \"./calendar/CalendarSelects\";\n\nexport type CalchemyRootProps = UseCalchemyOptions & {\n children: ReactNode;\n};\n\nfunction Root(props: CalchemyRootProps) {\n const { children, ...options } = props;\n const state = useCalchemy(options);\n\n return (\n <CalchemyContext.Provider value={state}>\n {children}\n </CalchemyContext.Provider>\n );\n}\n\nexport type CalchemyFieldProps = Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"value\" | \"onChange\" | \"onKeyDown\"\n> & {\n renderInlineCompletion?: boolean;\n};\n\nfunction Field({\n renderInlineCompletion = true,\n readOnly,\n ...props\n}: CalchemyFieldProps) {\n const state = useCalchemyContext();\n const inputProps = state.getInputProps();\n const completion =\n state.inputMode === \"field\" ? state.inlineCompletion : null;\n\n return (\n <span\n calchemy-field=\"\"\n calchemy-input-mode={state.inputMode}\n calchemy-has-completion={completion ? \"\" : undefined}\n >\n {renderInlineCompletion && completion ? (\n <span calchemy-field-backdrop=\"\" aria-hidden=\"true\">\n <span calchemy-field-typed=\"\">{state.inputValue}</span>\n <span calchemy-completions=\"\">{completion.suffix}</span>\n </span>\n ) : null}\n <input {...props} {...inputProps} readOnly={readOnly ?? inputProps.readOnly} />\n </span>\n );\n}\n\nexport type CalchemyInputModeProps = ComponentPropsWithoutRef<\"div\"> & {\n fieldLabel?: ReactNode;\n calendarLabel?: ReactNode;\n};\n\nfunction InputMode({\n fieldLabel = \"Type\",\n calendarLabel = \"Pick\",\n ...props\n}: CalchemyInputModeProps) {\n const state = useCalchemyContext();\n\n return (\n <div {...props} calchemy-mode=\"\" calchemy-active={state.inputMode} role=\"group\">\n <button\n type=\"button\"\n calchemy-value=\"field\"\n aria-pressed={state.inputMode === \"field\"}\n onClick={() => state.setInputMode(\"field\")}\n >\n {fieldLabel}\n </button>\n <button\n type=\"button\"\n calchemy-value=\"calendar\"\n aria-pressed={state.inputMode === \"calendar\"}\n onClick={() => state.setInputMode(\"calendar\")}\n >\n {calendarLabel}\n </button>\n </div>\n );\n}\n\nexport type CalchemyCandidatesProps = ComponentPropsWithoutRef<\"div\">;\n\nfunction Candidates(props: CalchemyCandidatesProps) {\n const state = useCalchemyContext();\n\n if (state.inputMode !== \"field\" || state.result.status !== \"ambiguous\") {\n return null;\n }\n\n const candidates =\n state.expectedValue && state.expectedValue !== \"multiple\"\n ? state.result.candidates.filter(\n (candidate) => candidate.value.kind === state.expectedValue,\n )\n : state.result.candidates;\n\n if (candidates.length === 0) {\n return null;\n }\n\n return (\n <div {...props} calchemy-candidates=\"\">\n {candidates.map((candidate) => (\n <button\n type=\"button\"\n key={candidate.id}\n calchemy-candidate=\"\"\n onClick={() => state.selectCandidate(candidate.id)}\n >\n {candidate.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport { useCalchemyCalendar, useCalchemyContext } from \"./calendar/context\";\n\nexport type {\n CalendarBounds,\n CalendarDuration,\n CalendarNamedDates,\n CalendarPeriodModel,\n CalendarPeriodUnit,\n CalendarState,\n CalendarWeekdayFormat,\n ParsedCalendarPeriod,\n} from \"./calendar/types\";\nexport type {\n CalchemyCalendarHeaderProps,\n CalchemyCalendarHeadingProps,\n CalchemyCalendarNavigationProps,\n CalchemyCalendarProps,\n} from \"./calendar/Calendar\";\nexport type {\n CalchemyCalendarGridProps,\n CalchemyCalendarWeekdaysProps,\n} from \"./calendar/CalendarGrid\";\nexport type { CalchemyCalendarPeriodHeadingProps } from \"./calendar/CalendarPeriodHeading\";\nexport type { CalchemyCalendarPeriodListProps } from \"./calendar/CalendarPeriodList\";\nexport type { CalchemyCalendarPeriodProps } from \"./calendar/CalendarPeriod\";\nexport type {\n CalchemyCalendarMonthSelectProps,\n CalchemyCalendarYearSelectProps,\n} from \"./calendar/CalendarSelects\";\n\nexport const Calchemy = {\n Root,\n Field,\n InputMode,\n Candidates,\n Calendar,\n CalendarHeader,\n CalendarHeading,\n CalendarPrevious,\n CalendarNext,\n CalendarPeriodList,\n CalendarPeriod,\n CalendarPeriodHeading,\n CalendarWeekdays,\n CalendarGrid,\n CalendarMonthSelect,\n CalendarYearSelect,\n};\n"],"mappings":"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","names":["useEffect","useState","useState","useEffect","useEffect","useMemo","useRef","useState","useMemo","useMemo","useState","useState","useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","useRef","useEffect","jsx","useContext","jsx","jsxs","useContext","useContext","useLayoutEffect","useRef","Fragment","jsx","jsxs","useContext","useRef","useLayoutEffect","jsx","jsx","jsxs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calchemy/date-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Headless React primitives for Calchemy date input.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@calchemy/date-core": "0.1.
|
|
39
|
+
"@calchemy/date-core": "0.1.2"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"react": ">=18.3.0 || >=19.0.0",
|