@calends/vue 0.0.0 → 0.2.0
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/README.md +4 -2
- package/dist/index.js +37 -36
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_useModel","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createElementBlock","_toDisplayString","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_unref","_openBlock","_createBlock","_withModifiers","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_unref","_openBlock","_createBlock","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","DRAG_THRESHOLD","FOCUSABLE","useInteractions","drag","shallowRef","selection","announcement","ref","editable","computed","toValue","options","selectable","snap","slotMin","slotMax","canEdit","event","resourceFromAttribute","value","match","resource","resolveTarget","element","x","y","host","kind","resourceId","rect","window","axisDays","along","axisMinutes","dayIndex","date","fraction","deltaBetween","daysBetween","origin","target","snapMinutes","applyDrag","delta","state","preview","moveEvent","resizeEvent","displayEvents","withTimes","displayResourceIds","ids","others","id","isDragging","changed","commit","detail","swallowNextClick","swallow","startPointerDrag","pointerEvent","onMove","distance","move","finish","onUp","onCancel","onEscape","cancelled","key","startSelection","anchor","range","selectedRange","toZoned","current","startDate","endDate","orderedRange","step","absolute","sameDay","low","high","startAt","endAt","startMinutes","endMinutes","describe","format","times","refocus","nextTick","keyboardPreview","moved","releaseKeyboard","endKeyboardDrag","handleHeldKey","axes","keyboardEvent","direction","sign","axis","unit","resizing","next","order","index","handleEventKeydown","useCalendar","view","weekStartsOn","timeZone","localTimeZone","locale","now","ticker","today","focusedDate","highlightedEventId","events","normalizeEvents","periodRange","interactions","resources","grid","createMonthGrid","resourceGrid","createResourceGrid","timeGrid","createTimeGrid","timeline","createTimeline","gantt","createGantt","focusedRow","title","periodTitle","visibleRange","setDate","focusDate","isSamePeriod","navigate","CALENDAR_CONTEXT","provideCalendarContext","context","injectCalendarContext","inject","component","CalendarHeading_default","defineComponent","openBlock","createBlock","unref","Primitive","__props","withCtx","renderSlot","_ctx","createTextVNode","toDisplayString","CalendarNav_default","props","calendar","showsToday","run","CalendarRoot_default","\"date\"","\"dateModifiers\"","__emit","emit","useModel","watch","focused","start","end","visuallyHidden","createCommentVNode","createElementBlock","MonthDay_default","isSelected","isFocused","label","count","_cache","MonthDayMore_default","EVENT_CONTEXT","useEventState","isHighlighted","isEditable","isPast","allDay","highlight","unhighlight","onPointerdown","onKeydown","interaction","injectEventPrimitive","EventBar_default","normalizeStyle","EventResizeHandle_default","$event","withModifiers","Gantt_default","GanttBar_default","GanttLinks_default","svg","measured","find","container","attribute","measure","fromBar","link","toBar","fromRow","fromRect","toRect","rowRect","from","to","gutterY","roundedPath","routeGanttLink","ganttLinkArrow","frame","scheduleMeasure","observer","onMounted","onBeforeUnmount","links","highlighted","touches","item","GanttRow_default","GanttToday_default","GanttTrack_default","MonthGrid_default","targetFor","startOfWeek","MonthWeek_default","MonthWeekday_default","longLabel","NowIndicator_default","minutes","wallMinutes","isVisible","ResourceCell_default","day","onFocus","ResourceDayHeader_default","weekday","ResourceGrid_default","lastRow","row","ResourceLabel_default","ResourceRow_default","TimeColumn_default","TimeEvent_default","TimeGrid_default","TimeSelection_default","selected","offset","Timeline_default","TimelineEvent_default","TimelineNow_default","local","candidate","TimelineRow_default","TimelineSelection_default","rowResource","toAxis","windowMinutes","slotMinMinutes","TimelineTrack_default"],"sources":["../src/useInteractions.ts","../src/useCalendar.ts","../src/CalendarHeading.vue","../src/CalendarHeading.vue","../src/CalendarNav.vue","../src/CalendarNav.vue","../src/CalendarRoot.vue","../src/CalendarRoot.vue","../src/MonthDay.vue","../src/MonthDay.vue","../src/MonthDayMore.vue","../src/MonthDayMore.vue","../src/useEventState.ts","../src/EventBar.vue","../src/EventBar.vue","../src/EventResizeHandle.vue","../src/EventResizeHandle.vue","../src/Gantt.vue","../src/Gantt.vue","../src/GanttBar.vue","../src/GanttBar.vue","../src/GanttLinks.vue","../src/GanttLinks.vue","../src/GanttRow.vue","../src/GanttRow.vue","../src/GanttToday.vue","../src/GanttToday.vue","../src/GanttTrack.vue","../src/GanttTrack.vue","../src/MonthGrid.vue","../src/MonthGrid.vue","../src/MonthWeek.vue","../src/MonthWeek.vue","../src/MonthWeekday.vue","../src/MonthWeekday.vue","../src/NowIndicator.vue","../src/NowIndicator.vue","../src/ResourceCell.vue","../src/ResourceCell.vue","../src/ResourceDayHeader.vue","../src/ResourceDayHeader.vue","../src/ResourceGrid.vue","../src/ResourceGrid.vue","../src/ResourceLabel.vue","../src/ResourceLabel.vue","../src/ResourceRow.vue","../src/ResourceRow.vue","../src/TimeColumn.vue","../src/TimeColumn.vue","../src/TimeEvent.vue","../src/TimeEvent.vue","../src/TimeGrid.vue","../src/TimeGrid.vue","../src/TimeSelection.vue","../src/TimeSelection.vue","../src/Timeline.vue","../src/Timeline.vue","../src/TimelineEvent.vue","../src/TimelineEvent.vue","../src/TimelineNow.vue","../src/TimelineNow.vue","../src/TimelineRow.vue","../src/TimelineRow.vue","../src/TimelineSelection.vue","../src/TimelineSelection.vue","../src/TimelineTrack.vue","../src/TimelineTrack.vue"],"sourcesContent":["import {\n computed,\n nextTick,\n onScopeDispose,\n ref,\n shallowRef,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from 'vue';\nimport {\n daysBetween,\n moveEvent,\n orderedRange,\n resizeEvent,\n snapMinutes,\n withTimes,\n type CalendarEvent,\n type CalendarEventInput,\n type CalendarResource,\n type EventDelta,\n type EventTimes,\n type ResourceId,\n} from '@calends/core';\n\n/** What sits under the pointer: a day cell, a point in a day's hours, or a point on a timeline. */\nexport interface DropTarget {\n kind: 'day' | 'time' | 'axis' | 'dayaxis';\n date: Temporal.PlainDate;\n /** Wall-clock minutes from midnight, for `time` and `axis` targets. */\n minutes: number | null;\n /** Present only on targets inside a resource row; null for the unassigned row. */\n resourceId?: ResourceId | null;\n}\n\nexport interface EventDropDetail<T extends CalendarEventInput = CalendarEventInput> {\n event: T;\n start: Temporal.PlainDate | Temporal.ZonedDateTime;\n end: Temporal.PlainDate | Temporal.ZonedDateTime;\n previousStart: Temporal.PlainDate | Temporal.ZonedDateTime;\n previousEnd: Temporal.PlainDate | Temporal.ZonedDateTime;\n allDay: boolean;\n /** Set only when the event moved to another resource row (null for unassigned). */\n resourceId?: ResourceId | null;\n previousResourceId?: ResourceId | null;\n}\n\nexport interface RangeSelectDetail {\n start: Temporal.PlainDate | Temporal.ZonedDateTime;\n /** Inclusive last day for all-day ranges, exclusive end time for timed ones. */\n end: Temporal.PlainDate | Temporal.ZonedDateTime;\n allDay: boolean;\n resourceId?: ResourceId | null;\n}\n\n/** How arrow keys move a picked-up event in each layout. */\nexport interface KeyboardAxes {\n horizontal: 'day' | 'minutes';\n vertical: 'week' | 'minutes' | 'resource' | 'none';\n /** Resource ids in row order, for `vertical: 'resource'`. */\n resourceOrder?: readonly (ResourceId | null)[];\n}\n\nexport interface InteractionOptions<T extends CalendarEventInput> {\n events: ComputedRef<CalendarEvent<T>[]>;\n resources: MaybeRefOrGetter<readonly CalendarResource[] | undefined>;\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n timeZone: ComputedRef<string>;\n locale: ComputedRef<string | undefined>;\n rangeStart: ComputedRef<Temporal.PlainDate>;\n slotMinMinutes: MaybeRefOrGetter<number | undefined>;\n slotMaxMinutes: MaybeRefOrGetter<number | undefined>;\n editable?: MaybeRefOrGetter<boolean | undefined>;\n selectable?: MaybeRefOrGetter<boolean | undefined>;\n snapMinutes?: MaybeRefOrGetter<number | undefined>;\n canEdit?: (event: T) => boolean;\n onEventDrop?: (detail: EventDropDetail<T>) => void;\n onEventResize?: (detail: EventDropDetail<T>) => void;\n onRangeSelect?: (detail: RangeSelectDetail) => void;\n}\n\ntype DragKind = 'move' | 'resize-start' | 'resize-end';\n\nexport interface DragState<T extends CalendarEventInput> {\n kind: DragKind;\n event: CalendarEvent<T>;\n origin: DropTarget;\n started: boolean;\n keyboard: boolean;\n pointer: { x: number; y: number };\n preview: EventTimes;\n resourceId: ResourceId | null | undefined;\n /** Keyboard only: accumulated movement, and a separate end-edge resize from Shift. */\n moveDelta: EventDelta;\n endDelta: EventDelta;\n axes?: KeyboardAxes;\n}\n\nconst DRAG_THRESHOLD = 4;\n\nconst FOCUSABLE = 'a[href], button, [tabindex]:not([tabindex=\"-1\"])';\n\nexport function useInteractions<T extends CalendarEventInput>(options: InteractionOptions<T>) {\n const drag = shallowRef<DragState<T> | null>(null);\n const selection = shallowRef<{ anchor: DropTarget; current: DropTarget } | null>(null);\n const announcement = ref('');\n\n const editable = computed(() => toValue(options.editable) ?? false);\n const selectable = computed(() => toValue(options.selectable) ?? false);\n const snap = computed(() => toValue(options.snapMinutes) ?? 15);\n const slotMin = computed(() => toValue(options.slotMinMinutes) ?? 0);\n const slotMax = computed(() => toValue(options.slotMaxMinutes) ?? 24 * 60);\n\n function canEdit(event: CalendarEvent<T>): boolean {\n return editable.value && (options.canEdit?.(event.source) ?? true);\n }\n\n function resourceFromAttribute(value: string | undefined): ResourceId | null | undefined {\n if (value === undefined) return undefined;\n if (value === '') return null;\n\n const match = (toValue(options.resources) ?? []).find(\n (resource) => String(resource.id) === value,\n );\n\n return match ? match.id : value;\n }\n\n /** Finds the drop target under a point, from the data attributes the primitives render. */\n function resolveTarget(x: number, y: number): DropTarget | null {\n for (const element of document.elementsFromPoint(x, y)) {\n // A bar's DOM parent is its start-day cell, not the day under the pointer, so look past events.\n if ((element as HTMLElement).closest('[data-event-id]')) continue;\n\n const host = (element as HTMLElement).closest<HTMLElement>('[data-drop]');\n\n if (!host) continue;\n\n const kind = host.dataset.drop as DropTarget['kind'];\n const resourceId = resourceFromAttribute(host.dataset.resourceId);\n const rect = host.getBoundingClientRect();\n const window = slotMax.value - slotMin.value;\n\n // A Gantt track: days across, its first day and length on the element itself.\n if (kind === 'dayaxis') {\n const axisDays = Number(host.dataset.axisDays);\n const along = Math.min(Math.max((x - rect.left) / rect.width, 0), 0.9999);\n\n return {\n kind,\n date: Temporal.PlainDate.from(host.dataset.axisStart!).add({\n days: Math.floor(along * axisDays),\n }),\n minutes: null,\n resourceId,\n };\n }\n\n if (kind === 'axis') {\n const axisMinutes = Number(host.dataset.axisMinutes);\n const along =\n Math.min(Math.max((x - rect.left) / rect.width, 0), 0.9999) * axisMinutes;\n const dayIndex = Math.floor(along / window);\n\n return {\n kind,\n date: options.rangeStart.value.add({ days: dayIndex }),\n minutes: slotMin.value + (along - dayIndex * window),\n resourceId,\n };\n }\n\n const date = Temporal.PlainDate.from(host.dataset.date!);\n\n if (kind === 'time') {\n const fraction = Math.min(Math.max((y - rect.top) / rect.height, 0), 1);\n\n return { kind, date, minutes: slotMin.value + fraction * window, resourceId };\n }\n\n return { kind, date, minutes: null, resourceId };\n }\n\n return null;\n }\n\n function deltaBetween(origin: DropTarget, target: DropTarget): EventDelta {\n const days = daysBetween(origin.date, target.date);\n const minutes =\n origin.minutes !== null && target.minutes !== null\n ? snapMinutes(target.minutes - origin.minutes, snap.value)\n : 0;\n\n return { days, minutes };\n }\n\n function applyDrag(state: DragState<T>, target: DropTarget) {\n const delta = deltaBetween(state.origin, target);\n const preview =\n state.kind === 'move'\n ? moveEvent(state.event, delta)\n : resizeEvent(\n state.event,\n state.kind === 'resize-start' ? 'start' : 'end',\n delta,\n snap.value,\n );\n const resourceId =\n state.kind === 'move' &&\n target.resourceId !== undefined &&\n state.origin.resourceId !== undefined\n ? target.resourceId\n : state.origin.resourceId;\n\n drag.value = { ...state, started: true, preview, resourceId };\n }\n\n /** The events with the dragged one at its preview position, for every layout to render. */\n const displayEvents = computed(() => {\n const state = drag.value;\n\n if (!state?.started) return options.events.value;\n\n return options.events.value.map((event) =>\n event.id === state.event.id ? withTimes(event, state.preview) : event,\n );\n });\n\n /** Resource ids with the dragged event moved to its preview row. */\n function displayResourceIds(event: T): readonly ResourceId[] | null | undefined {\n const ids = options.getResourceIds?.(event);\n const state = drag.value;\n\n if (\n !state?.started ||\n state.event.source !== event ||\n state.resourceId === state.origin.resourceId\n ) {\n return ids;\n }\n\n const others = (ids ?? []).filter((id) => id !== state.origin.resourceId);\n\n return state.resourceId === null || state.resourceId === undefined\n ? others\n : [...new Set([...others, state.resourceId])];\n }\n\n function isDragging(event: CalendarEvent<T>): boolean {\n return Boolean(drag.value?.started && drag.value.event.id === event.id);\n }\n\n function changed(state: DragState<T>): boolean {\n return (\n !state.preview.start.equals(state.event.start as never) ||\n !state.preview.end.equals(state.event.end as never) ||\n state.resourceId !== state.origin.resourceId\n );\n }\n\n function commit(state: DragState<T>) {\n if (!changed(state)) return;\n\n const detail: EventDropDetail<T> = {\n event: state.event.source,\n start: state.preview.start,\n end: state.preview.end,\n previousStart: state.event.start,\n previousEnd: state.event.end,\n allDay: state.event.allDay,\n };\n\n if (state.resourceId !== state.origin.resourceId) {\n detail.resourceId = state.resourceId;\n detail.previousResourceId = state.origin.resourceId;\n }\n\n if (state.kind === 'move') {\n options.onEventDrop?.(detail);\n } else {\n options.onEventResize?.(detail);\n }\n }\n\n function swallowNextClick() {\n const swallow = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.addEventListener('click', swallow, { capture: true, once: true });\n // If no click follows (the pointer left the element), don't eat a later one.\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 0);\n }\n\n function startPointerDrag(pointerEvent: PointerEvent, event: CalendarEvent<T>, kind: DragKind) {\n if (pointerEvent.button !== 0 || pointerEvent.pointerType === 'touch' || !canEdit(event))\n return;\n\n const origin = resolveTarget(pointerEvent.clientX, pointerEvent.clientY);\n\n if (!origin) return;\n\n // Stops the browser's own link drag and text selection, which would cancel the pointer.\n pointerEvent.preventDefault();\n\n if (kind !== 'move') {\n pointerEvent.stopPropagation();\n }\n\n drag.value = {\n kind,\n event,\n origin,\n started: false,\n keyboard: false,\n pointer: { x: pointerEvent.clientX, y: pointerEvent.clientY },\n preview: { start: event.start, end: event.end },\n resourceId: origin.resourceId,\n moveDelta: {},\n endDelta: {},\n };\n\n const onMove = (move: PointerEvent) => {\n const state = drag.value;\n\n if (!state) return;\n\n const distance = Math.hypot(\n move.clientX - state.pointer.x,\n move.clientY - state.pointer.y,\n );\n\n if (!state.started && distance < DRAG_THRESHOLD) return;\n\n const target = resolveTarget(move.clientX, move.clientY);\n\n if (target) {\n applyDrag(state, target);\n }\n };\n\n const finish = (cancelled: boolean) => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onEscape);\n\n const state = drag.value;\n drag.value = null;\n\n if (state?.started) {\n swallowNextClick();\n\n if (!cancelled) commit(state);\n }\n };\n\n const onUp = () => finish(false);\n const onCancel = () => finish(true);\n const onEscape = (key: KeyboardEvent) => key.key === 'Escape' && finish(true);\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onEscape);\n }\n\n function startSelection(pointerEvent: PointerEvent) {\n const element = pointerEvent.target as HTMLElement | null;\n\n if (\n !selectable.value ||\n pointerEvent.button !== 0 ||\n pointerEvent.pointerType === 'touch' ||\n element?.closest('[data-event-id], [data-calendar-control]')\n ) {\n return;\n }\n\n const anchor = resolveTarget(pointerEvent.clientX, pointerEvent.clientY);\n\n if (!anchor) return;\n\n // Stops text selection while dragging, which also skips the click's focus, so focus by hand.\n pointerEvent.preventDefault();\n element?.closest<HTMLElement>('[role=\"gridcell\"]')?.focus();\n selection.value = { anchor, current: anchor };\n\n const onMove = (move: PointerEvent) => {\n const target = resolveTarget(move.clientX, move.clientY);\n\n if (target && target.kind === anchor.kind) {\n selection.value = { anchor, current: target };\n }\n };\n\n const finish = (cancelled: boolean) => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onEscape);\n\n const range = selectedRange.value;\n selection.value = null;\n\n if (!cancelled && range) {\n options.onRangeSelect?.(range.detail);\n }\n };\n\n const onUp = () => finish(false);\n const onCancel = () => finish(true);\n const onEscape = (key: KeyboardEvent) => key.key === 'Escape' && finish(true);\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onEscape);\n }\n\n const toZoned = (date: Temporal.PlainDate, minutes: number) =>\n date.toPlainDateTime({ hour: 0 }).add({ minutes }).toZonedDateTime(options.timeZone.value);\n\n /**\n * The selection in a form the layouts can draw: whole days for cells, a minute range on\n * the anchor's day for time columns, and axis minutes for timelines.\n */\n const selectedRange = computed(() => {\n const current = selection.value;\n\n if (!current) return null;\n\n const { anchor } = current;\n\n if (anchor.kind === 'day' || anchor.kind === 'dayaxis') {\n const [startDate, endDate] = orderedRange(anchor.date, current.current.date);\n\n return {\n kind: anchor.kind,\n resourceId: anchor.resourceId,\n startDate,\n endDate,\n detail: {\n start: startDate,\n end: endDate,\n allDay: true,\n resourceId: anchor.resourceId,\n },\n };\n }\n\n const step = snap.value;\n const absolute = (target: DropTarget) =>\n daysBetween(options.rangeStart.value, target.date) * 24 * 60 + target.minutes!;\n const sameDay = anchor.kind === 'time';\n const [low, high] = orderedRange(\n sameDay ? anchor.minutes! : absolute(anchor),\n sameDay ? current.current.minutes! : absolute(current.current),\n );\n const startAt = Math.floor(low / step) * step;\n const endAt = Math.max(Math.ceil(high / step) * step, startAt + step);\n\n const startDate = sameDay\n ? anchor.date\n : options.rangeStart.value.add({ days: Math.floor(startAt / 1440) });\n const startMinutes = sameDay ? startAt : startAt % 1440;\n const endDate = sameDay\n ? anchor.date\n : options.rangeStart.value.add({ days: Math.floor(endAt / 1440) });\n const endMinutes = sameDay ? endAt : endAt % 1440;\n\n return {\n kind: anchor.kind,\n resourceId: anchor.resourceId,\n startDate,\n endDate,\n startMinutes,\n endMinutes,\n detail: {\n start: toZoned(startDate, startMinutes),\n end: toZoned(endDate, endMinutes),\n allDay: false,\n resourceId: anchor.resourceId,\n },\n };\n });\n\n function describe(times: EventTimes): string {\n const format = (value: Temporal.PlainDate | Temporal.ZonedDateTime) =>\n value instanceof Temporal.PlainDate\n ? value.toLocaleString(options.locale.value, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n })\n : value.toLocaleString(options.locale.value, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n\n return `${format(times.start)} to ${format(times.end)}`;\n }\n\n async function refocus(event: CalendarEvent<T>) {\n await nextTick();\n\n const element = document.querySelector<HTMLElement>(\n `[data-event-id=\"${CSS.escape(String(event.id))}\"]`,\n );\n const target = element?.matches(FOCUSABLE)\n ? element\n : element?.querySelector<HTMLElement>(FOCUSABLE);\n\n target?.focus();\n }\n\n function keyboardPreview(state: DragState<T>): DragState<T> {\n const moved = moveEvent(state.event, state.moveDelta);\n const preview =\n state.endDelta.days || state.endDelta.minutes\n ? resizeEvent(withTimes(state.event, moved), 'end', state.endDelta, snap.value)\n : moved;\n\n return { ...state, preview };\n }\n\n let releaseKeyboard: (() => void) | null = null;\n\n function endKeyboardDrag() {\n releaseKeyboard?.();\n releaseKeyboard = null;\n }\n\n onScopeDispose(endKeyboardDrag);\n\n function handleHeldKey(keyboardEvent: KeyboardEvent) {\n const state = drag.value;\n\n if (!state?.keyboard) {\n endKeyboardDrag();\n\n return;\n }\n\n const event = state.event;\n const axes = state.axes!;\n\n if (keyboardEvent.key === 'Escape') {\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n drag.value = null;\n endKeyboardDrag();\n announcement.value = 'Move cancelled.';\n refocus(event);\n\n return;\n }\n\n if (keyboardEvent.key === ' ' || keyboardEvent.key === 'Enter') {\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n drag.value = null;\n endKeyboardDrag();\n commit({\n ...state,\n kind: state.endDelta.days || state.endDelta.minutes ? 'resize-end' : 'move',\n });\n announcement.value = `Dropped. ${describe(state.preview)}.`;\n refocus(event);\n\n return;\n }\n\n const directions: Record<string, [number, 'horizontal' | 'vertical']> = {\n ArrowLeft: [-1, 'horizontal'],\n ArrowRight: [1, 'horizontal'],\n ArrowUp: [-1, 'vertical'],\n ArrowDown: [1, 'vertical'],\n };\n const direction = directions[keyboardEvent.key];\n\n if (!direction) return;\n\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n\n const [sign, axis] = direction;\n const unit = axis === 'horizontal' ? axes.horizontal : axes.vertical;\n const resizing = keyboardEvent.shiftKey;\n const delta = { ...(resizing ? state.endDelta : state.moveDelta) };\n const step = event.allDay ? 0 : snap.value;\n let next: DragState<T> = state;\n\n if (unit === 'day') {\n delta.days = (delta.days ?? 0) + sign;\n } else if (unit === 'week') {\n delta.days = (delta.days ?? 0) + sign * 7;\n } else if (unit === 'minutes' && step) {\n delta.minutes = (delta.minutes ?? 0) + sign * step;\n } else if (unit === 'resource' && axes.resourceOrder && !resizing) {\n const order = axes.resourceOrder;\n const index = order.indexOf(state.resourceId ?? null);\n\n next = {\n ...state,\n resourceId: order[Math.min(Math.max(index + sign, 0), order.length - 1)],\n };\n } else {\n return;\n }\n\n if (unit !== 'resource') {\n next = resizing ? { ...next, endDelta: delta } : { ...next, moveDelta: delta };\n }\n\n next = keyboardPreview(next);\n drag.value = next;\n announcement.value = describe(next.preview);\n refocus(event);\n }\n\n /**\n * Space picks an event up; then arrows move it (Shift+arrows stretch its end), Space or\n * Enter drops it, and Escape puts it back. While it's held, keys are read on the window:\n * each move re-renders the event in its new cell, which briefly takes focus away.\n */\n function handleEventKeydown(\n keyboardEvent: KeyboardEvent,\n event: CalendarEvent<T>,\n axes: KeyboardAxes,\n resourceId?: ResourceId | null,\n ) {\n if (keyboardEvent.key !== ' ' || drag.value || !canEdit(event)) return;\n\n keyboardEvent.preventDefault();\n drag.value = {\n kind: 'move',\n event,\n origin: { kind: 'day', date: event.startDate, minutes: null, resourceId },\n started: true,\n keyboard: true,\n pointer: { x: 0, y: 0 },\n preview: { start: event.start, end: event.end },\n resourceId,\n moveDelta: { days: 0, minutes: 0 },\n endDelta: { days: 0, minutes: 0 },\n axes,\n };\n announcement.value =\n 'Picked up. Arrow keys move it, Shift with arrows changes its end, Space drops it, Escape cancels.';\n\n window.addEventListener('keydown', handleHeldKey, { capture: true });\n releaseKeyboard = () =>\n window.removeEventListener('keydown', handleHeldKey, { capture: true });\n }\n\n return {\n editable,\n selectable,\n drag,\n selectedRange,\n announcement,\n displayEvents,\n displayResourceIds,\n canEdit,\n isDragging,\n startPointerDrag,\n startSelection,\n handleEventKeydown,\n };\n}\n","import {\n computed,\n inject,\n onScopeDispose,\n provide,\n ref,\n toValue,\n type InjectionKey,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue';\nimport {\n createGantt,\n createMonthGrid,\n createResourceGrid,\n createTimeGrid,\n createTimeline,\n isSamePeriod,\n localTimeZone,\n navigate,\n normalizeEvents,\n periodRange,\n periodTitle,\n type CalendarEventInput,\n type CalendarResource,\n type CalendarView,\n type GanttLinkInput,\n type GanttScale,\n type ResourceId,\n type WeekDay,\n} from '@calends/core';\nimport {\n useInteractions,\n type EventDropDetail,\n type RangeSelectDetail,\n} from './useInteractions.js';\n\nexport interface UseCalendarOptions<T extends CalendarEventInput> {\n date: Ref<Temporal.PlainDate>;\n events?: MaybeRefOrGetter<readonly T[]>;\n view?: MaybeRefOrGetter<CalendarView>;\n weekStartsOn?: MaybeRefOrGetter<WeekDay>;\n timeZone?: MaybeRefOrGetter<string | undefined>;\n locale?: MaybeRefOrGetter<string | undefined>;\n fixedWeeks?: MaybeRefOrGetter<boolean>;\n maxLanes?: MaybeRefOrGetter<number | undefined>;\n today?: MaybeRefOrGetter<Temporal.PlainDate | undefined>;\n resources?: MaybeRefOrGetter<readonly CalendarResource[] | undefined>;\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n unassigned?: MaybeRefOrGetter<boolean | undefined>;\n /** The time grid's daily window, in minutes from midnight. */\n slotMinMinutes?: MaybeRefOrGetter<number | undefined>;\n slotMaxMinutes?: MaybeRefOrGetter<number | undefined>;\n /** Minutes per timeline header slot. */\n slotMinutes?: MaybeRefOrGetter<number | undefined>;\n /** Column width of the Gantt view. */\n ganttScale?: MaybeRefOrGetter<GanttScale | undefined>;\n /** Lines between Gantt rows, by event id. */\n ganttLinks?: MaybeRefOrGetter<readonly GanttLinkInput[] | undefined>;\n /** Lets events be moved and resized; the calendar reports the change and the app commits it. */\n editable?: MaybeRefOrGetter<boolean | undefined>;\n /** Lets people drag across empty cells or hours to select a range. */\n selectable?: MaybeRefOrGetter<boolean | undefined>;\n /** Minutes timed drags and selections snap to. */\n snapMinutes?: MaybeRefOrGetter<number | undefined>;\n canEdit?: (event: T) => boolean;\n onEventDrop?: (detail: EventDropDetail<T>) => void;\n onEventResize?: (detail: EventDropDetail<T>) => void;\n onRangeSelect?: (detail: RangeSelectDetail) => void;\n}\n\nexport function useCalendar<T extends CalendarEventInput>(options: UseCalendarOptions<T>) {\n const { date } = options;\n const view = computed(() => toValue(options.view) ?? 'month');\n const weekStartsOn = computed(() => toValue(options.weekStartsOn) ?? 7);\n const timeZone = computed(() => toValue(options.timeZone) ?? localTimeZone());\n const locale = computed(() => toValue(options.locale));\n const now = ref(Temporal.Now.zonedDateTimeISO(timeZone.value)) as Ref<Temporal.ZonedDateTime>;\n\n // SSR never disposes component scopes, so a server-side interval would leak per render.\n if (typeof window !== 'undefined') {\n const ticker = setInterval(\n () => (now.value = Temporal.Now.zonedDateTimeISO(timeZone.value)),\n 60_000,\n );\n\n onScopeDispose(() => clearInterval(ticker));\n }\n\n const today = computed(\n () => toValue(options.today) ?? now.value.withTimeZone(timeZone.value).toPlainDate(),\n );\n const focusedDate = ref(date.value) as Ref<Temporal.PlainDate>;\n /** The event under the pointer or focus, so every segment of it can highlight together. */\n const highlightedEventId = ref<string | number | null>(null);\n\n const events = computed(() =>\n normalizeEvents(toValue(options.events) ?? [], { timeZone: timeZone.value }),\n );\n\n /** The period's own days; the month grid pads these out to whole weeks. */\n const range = computed(() => periodRange(date.value, view.value, weekStartsOn.value));\n\n const interactions = useInteractions<T>({\n events,\n resources: options.resources,\n getResourceIds: options.getResourceIds,\n timeZone,\n locale,\n rangeStart: computed(() => range.value.start),\n slotMinMinutes: options.slotMinMinutes,\n slotMaxMinutes: options.slotMaxMinutes,\n editable: options.editable,\n selectable: options.selectable,\n snapMinutes: options.snapMinutes,\n canEdit: options.canEdit,\n onEventDrop: options.onEventDrop,\n onEventResize: options.onEventResize,\n onRangeSelect: options.onRangeSelect,\n });\n\n const resources = computed(() => toValue(options.resources));\n const displayEvents = interactions.displayEvents;\n const displayResourceIds = (event: T) => interactions.displayResourceIds(event);\n\n const grid = computed(() =>\n createMonthGrid({\n date: date.value,\n events: displayEvents.value,\n weekStartsOn: weekStartsOn.value,\n fixedWeeks: toValue(options.fixedWeeks) ?? false,\n maxLanes: toValue(options.maxLanes),\n today: today.value,\n }),\n );\n\n const resourceGrid = computed(() =>\n createResourceGrid({\n ...range.value,\n resources: toValue(options.resources) ?? [],\n events: displayEvents.value,\n getResourceIds: displayResourceIds,\n unassigned: toValue(options.unassigned) ?? false,\n today: today.value,\n }),\n );\n\n const timeGrid = computed(() =>\n createTimeGrid({\n ...range.value,\n events: displayEvents.value,\n slotMinMinutes: toValue(options.slotMinMinutes) ?? 0,\n slotMaxMinutes: toValue(options.slotMaxMinutes) ?? 24 * 60,\n today: today.value,\n }),\n );\n\n /** Without `resources`, the timeline is a single row of every event. */\n const timeline = computed(() =>\n createTimeline({\n ...range.value,\n events: displayEvents.value,\n resources: resources.value,\n getResourceIds: displayResourceIds,\n unassigned: toValue(options.unassigned) ?? false,\n slotMinMinutes: toValue(options.slotMinMinutes) ?? 0,\n slotMaxMinutes: toValue(options.slotMaxMinutes) ?? 24 * 60,\n slotMinutes: toValue(options.slotMinutes) ?? 60,\n today: today.value,\n }),\n );\n\n /** Fitted to the undragged events, so the axis holds still while a drag previews. */\n const gantt = computed(() =>\n createGantt({\n events: displayEvents.value,\n rangeEvents: events.value,\n scale: toValue(options.ganttScale) ?? 'week',\n weekStartsOn: weekStartsOn.value,\n today: today.value,\n links: toValue(options.ganttLinks) ?? [],\n }),\n );\n\n /** Row index of the focused resource cell, alongside `focusedDate`. */\n const focusedRow = ref(0);\n\n const title = computed(() =>\n periodTitle(date.value, view.value, weekStartsOn.value, locale.value),\n );\n\n const visibleRange = computed(() => ({ start: grid.value.start, end: grid.value.end }));\n\n function setDate(value: Temporal.PlainDate) {\n date.value = value;\n focusedDate.value = value;\n }\n\n /** Moves focus, and pages the view when the date leaves the current period. */\n function focusDate(value: Temporal.PlainDate) {\n focusedDate.value = value;\n\n if (!isSamePeriod(value, date.value, view.value, weekStartsOn.value)) {\n date.value = value;\n }\n }\n\n return {\n date,\n view,\n weekStartsOn,\n timeZone,\n locale,\n now,\n today,\n focusedDate,\n focusedRow,\n highlightedEventId,\n events,\n resources,\n grid,\n range,\n resourceGrid,\n timeGrid,\n timeline,\n gantt,\n title,\n visibleRange,\n setDate,\n focusDate,\n prev: () => setDate(navigate(date.value, view.value, -1)),\n next: () => setDate(navigate(date.value, view.value, 1)),\n goToToday: () => setDate(today.value),\n ...interactions,\n };\n}\n\nexport type CalendarContext = ReturnType<typeof useCalendar>;\n\nconst CALENDAR_CONTEXT: InjectionKey<CalendarContext> = Symbol('CalendarContext');\n\n/** Children see events as plain `CalendarEventInput`, so the root's event type is erased here. */\nexport function provideCalendarContext<T extends CalendarEventInput>(\n context: ReturnType<typeof useCalendar<T>>,\n) {\n provide(CALENDAR_CONTEXT, context as unknown as CalendarContext);\n}\n\nexport function injectCalendarContext(component: string): CalendarContext {\n const context = inject(CALENDAR_CONTEXT, null);\n\n if (!context) {\n throw new Error(`<${component}> must be used inside <CalendarRoot>.`);\n }\n\n return context;\n}\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'h2' });\n\nconst { title } = injectCalendarContext('CalendarHeading');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n aria-live=\"polite\"\n >\n <slot :title=\"title\">{{ title }}</slot>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'h2' });\n\nconst { title } = injectCalendarContext('CalendarHeading');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n aria-live=\"polite\"\n >\n <slot :title=\"title\">{{ title }}</slot>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { isSamePeriod } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { action: 'prev' | 'next' | 'today' }>(), {\n as: 'button',\n});\n\nconst calendar = injectCalendarContext('CalendarNav');\n\nconst showsToday = computed(\n () =>\n props.action === 'today' &&\n isSamePeriod(\n calendar.date.value,\n calendar.today.value,\n calendar.view.value,\n calendar.weekStartsOn.value,\n ),\n);\n\nfunction run() {\n if (props.action === 'prev') {\n calendar.prev();\n } else if (props.action === 'next') {\n calendar.next();\n } else {\n calendar.goToToday();\n }\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :data-action=\"action\"\n :data-current=\"showsToday ? '' : undefined\"\n @click=\"run\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { isSamePeriod } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { action: 'prev' | 'next' | 'today' }>(), {\n as: 'button',\n});\n\nconst calendar = injectCalendarContext('CalendarNav');\n\nconst showsToday = computed(\n () =>\n props.action === 'today' &&\n isSamePeriod(\n calendar.date.value,\n calendar.today.value,\n calendar.view.value,\n calendar.weekStartsOn.value,\n ),\n);\n\nfunction run() {\n if (props.action === 'prev') {\n calendar.prev();\n } else if (props.action === 'next') {\n calendar.next();\n } else {\n calendar.goToToday();\n }\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :data-action=\"action\"\n :data-current=\"showsToday ? '' : undefined\"\n @click=\"run\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends CalendarEventInput\">\nimport { watch } from 'vue';\nimport type {\n CalendarEventInput,\n CalendarResource,\n CalendarView,\n GanttLinkInput,\n GanttScale,\n ResourceId,\n WeekDay,\n} from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { provideCalendarContext, useCalendar } from './useCalendar.js';\nimport type { EventDropDetail, RangeSelectDetail } from './useInteractions.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n events?: readonly T[];\n view?: CalendarView;\n weekStartsOn?: WeekDay;\n timeZone?: string;\n locale?: string;\n fixedWeeks?: boolean;\n maxLanes?: number;\n today?: Temporal.PlainDate;\n resources?: readonly CalendarResource[];\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n /** Adds a row for events whose resources aren't in `resources`. */\n unassigned?: boolean;\n slotMinMinutes?: number;\n slotMaxMinutes?: number;\n slotMinutes?: number;\n ganttScale?: GanttScale;\n ganttLinks?: readonly GanttLinkInput[];\n editable?: boolean;\n selectable?: boolean;\n snapMinutes?: number;\n canEdit?: (event: T) => boolean;\n }\n >(),\n { as: 'div', events: () => [], view: 'month', weekStartsOn: 7, fixedWeeks: false },\n);\n\nconst emit = defineEmits<{\n 'event-drop': [detail: EventDropDetail<T>];\n 'event-resize': [detail: EventDropDetail<T>];\n 'range-select': [detail: RangeSelectDetail];\n}>();\n\nconst date = defineModel<Temporal.PlainDate>('date', {\n default: () => Temporal.Now.plainDateISO(),\n});\n\nconst calendar = useCalendar<T>({\n date,\n events: () => props.events,\n view: () => props.view,\n weekStartsOn: () => props.weekStartsOn,\n timeZone: () => props.timeZone,\n locale: () => props.locale,\n fixedWeeks: () => props.fixedWeeks,\n maxLanes: () => props.maxLanes,\n today: () => props.today,\n resources: () => props.resources,\n getResourceIds: (event) => props.getResourceIds?.(event),\n unassigned: () => props.unassigned,\n slotMinMinutes: () => props.slotMinMinutes,\n slotMaxMinutes: () => props.slotMaxMinutes,\n slotMinutes: () => props.slotMinutes,\n ganttScale: () => props.ganttScale,\n ganttLinks: () => props.ganttLinks,\n editable: () => props.editable,\n selectable: () => props.selectable,\n snapMinutes: () => props.snapMinutes,\n canEdit: (event) => props.canEdit?.(event) ?? true,\n onEventDrop: (detail) => emit('event-drop', detail),\n onEventResize: (detail) => emit('event-resize', detail),\n onRangeSelect: (detail) => emit('range-select', detail),\n});\n\nwatch(date, (value) => {\n const { start, end } = calendar.range.value;\n const focused = calendar.focusedDate.value;\n\n if (\n Temporal.PlainDate.compare(focused, start) < 0 ||\n Temporal.PlainDate.compare(focused, end) > 0\n ) {\n calendar.focusedDate.value = value;\n }\n});\n\nprovideCalendarContext(calendar);\n\n/** Keyboard move announcements; inline so the package needs no stylesheet. */\nconst visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n} as const;\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-view=\"calendar.view.value\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :date=\"date\"\n :title=\"calendar.title.value\"\n :visible-range=\"calendar.visibleRange.value\"\n :prev=\"calendar.prev\"\n :next=\"calendar.next\"\n :go-to-today=\"calendar.goToToday\"\n />\n <div\n v-if=\"!asChild\"\n aria-live=\"polite\"\n :style=\"visuallyHidden\"\n >\n {{ calendar.announcement.value }}\n </div>\n </Primitive>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends CalendarEventInput\">\nimport { watch } from 'vue';\nimport type {\n CalendarEventInput,\n CalendarResource,\n CalendarView,\n GanttLinkInput,\n GanttScale,\n ResourceId,\n WeekDay,\n} from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { provideCalendarContext, useCalendar } from './useCalendar.js';\nimport type { EventDropDetail, RangeSelectDetail } from './useInteractions.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n events?: readonly T[];\n view?: CalendarView;\n weekStartsOn?: WeekDay;\n timeZone?: string;\n locale?: string;\n fixedWeeks?: boolean;\n maxLanes?: number;\n today?: Temporal.PlainDate;\n resources?: readonly CalendarResource[];\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n /** Adds a row for events whose resources aren't in `resources`. */\n unassigned?: boolean;\n slotMinMinutes?: number;\n slotMaxMinutes?: number;\n slotMinutes?: number;\n ganttScale?: GanttScale;\n ganttLinks?: readonly GanttLinkInput[];\n editable?: boolean;\n selectable?: boolean;\n snapMinutes?: number;\n canEdit?: (event: T) => boolean;\n }\n >(),\n { as: 'div', events: () => [], view: 'month', weekStartsOn: 7, fixedWeeks: false },\n);\n\nconst emit = defineEmits<{\n 'event-drop': [detail: EventDropDetail<T>];\n 'event-resize': [detail: EventDropDetail<T>];\n 'range-select': [detail: RangeSelectDetail];\n}>();\n\nconst date = defineModel<Temporal.PlainDate>('date', {\n default: () => Temporal.Now.plainDateISO(),\n});\n\nconst calendar = useCalendar<T>({\n date,\n events: () => props.events,\n view: () => props.view,\n weekStartsOn: () => props.weekStartsOn,\n timeZone: () => props.timeZone,\n locale: () => props.locale,\n fixedWeeks: () => props.fixedWeeks,\n maxLanes: () => props.maxLanes,\n today: () => props.today,\n resources: () => props.resources,\n getResourceIds: (event) => props.getResourceIds?.(event),\n unassigned: () => props.unassigned,\n slotMinMinutes: () => props.slotMinMinutes,\n slotMaxMinutes: () => props.slotMaxMinutes,\n slotMinutes: () => props.slotMinutes,\n ganttScale: () => props.ganttScale,\n ganttLinks: () => props.ganttLinks,\n editable: () => props.editable,\n selectable: () => props.selectable,\n snapMinutes: () => props.snapMinutes,\n canEdit: (event) => props.canEdit?.(event) ?? true,\n onEventDrop: (detail) => emit('event-drop', detail),\n onEventResize: (detail) => emit('event-resize', detail),\n onRangeSelect: (detail) => emit('range-select', detail),\n});\n\nwatch(date, (value) => {\n const { start, end } = calendar.range.value;\n const focused = calendar.focusedDate.value;\n\n if (\n Temporal.PlainDate.compare(focused, start) < 0 ||\n Temporal.PlainDate.compare(focused, end) > 0\n ) {\n calendar.focusedDate.value = value;\n }\n});\n\nprovideCalendarContext(calendar);\n\n/** Keyboard move announcements; inline so the package needs no stylesheet. */\nconst visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n} as const;\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-view=\"calendar.view.value\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :date=\"date\"\n :title=\"calendar.title.value\"\n :visible-range=\"calendar.visibleRange.value\"\n :prev=\"calendar.prev\"\n :next=\"calendar.next\"\n :go-to-today=\"calendar.goToToday\"\n />\n <div\n v-if=\"!asChild\"\n aria-live=\"polite\"\n :style=\"visuallyHidden\"\n >\n {{ calendar.announcement.value }}\n </div>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'div',\n});\n\nconst calendar = injectCalendarContext('MonthDay');\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n Temporal.PlainDate.compare(props.day.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.day.date, range.endDate) <= 0\n );\n});\n\nconst isFocused = computed(() => props.day.date.equals(calendar.focusedDate.value));\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.day.eventCount;\n\n return count ? `${date}, ${count} ${count === 1 ? 'event' : 'events'}` : date;\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :aria-current=\"day.isToday ? 'date' : undefined\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-outside=\"day.isOutside ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-overflow=\"day.hiddenCount ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n @focus=\"calendar.focusedDate.value = day.date\"\n >\n <slot\n :day=\"day\"\n :segments=\"day.segments\"\n :covering-segments=\"day.coveringSegments\"\n :hidden-count=\"day.hiddenCount\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'div',\n});\n\nconst calendar = injectCalendarContext('MonthDay');\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n Temporal.PlainDate.compare(props.day.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.day.date, range.endDate) <= 0\n );\n});\n\nconst isFocused = computed(() => props.day.date.equals(calendar.focusedDate.value));\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.day.eventCount;\n\n return count ? `${date}, ${count} ${count === 1 ? 'event' : 'events'}` : date;\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :aria-current=\"day.isToday ? 'date' : undefined\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-outside=\"day.isOutside ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-overflow=\"day.hiddenCount ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n @focus=\"calendar.focusedDate.value = day.date\"\n >\n <slot\n :day=\"day\"\n :segments=\"day.segments\"\n :covering-segments=\"day.coveringSegments\"\n :hidden-count=\"day.hiddenCount\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders nothing on days where every event fits, so the recipe can place it unconditionally. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'button',\n});\n\nconst { locale } = injectCalendarContext('MonthDayMore');\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(locale.value, { month: 'long', day: 'numeric' });\n\n return `Show all ${props.day.eventCount} events on ${date}`;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"day.hiddenCount\"\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :aria-label=\"label\"\n >\n <slot\n :hidden-count=\"day.hiddenCount\"\n :event-count=\"day.eventCount\"\n >+{{ day.hiddenCount }} more</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders nothing on days where every event fits, so the recipe can place it unconditionally. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'button',\n});\n\nconst { locale } = injectCalendarContext('MonthDayMore');\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(locale.value, { month: 'long', day: 'numeric' });\n\n return `Show all ${props.day.eventCount} events on ${date}`;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"day.hiddenCount\"\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :aria-label=\"label\"\n >\n <slot\n :hidden-count=\"day.hiddenCount\"\n :event-count=\"day.eventCount\"\n >+{{ day.hiddenCount }} more</slot\n >\n </Primitive>\n</template>\n","import { computed, inject, provide, toValue, type InjectionKey, type MaybeRefOrGetter } from 'vue';\nimport type { CalendarEvent, ResourceId } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\ninterface EventPrimitiveContext {\n event: () => CalendarEvent<any>;\n}\n\nconst EVENT_CONTEXT: InjectionKey<EventPrimitiveContext> = Symbol('CalendarEventPrimitive');\n\n/**\n * Past, highlighted, editable, and dragging state shared by every way of drawing an event,\n * plus its pointer and key handlers. Highlighting goes through the calendar context so every\n * piece of one event (each week's bar, each day of an overnight event) lights up together.\n */\nexport function useEventState(\n component: string,\n event: MaybeRefOrGetter<CalendarEvent<any>>,\n interaction: {\n axes: MaybeRefOrGetter<KeyboardAxes>;\n resourceId?: MaybeRefOrGetter<ResourceId | null | undefined>;\n },\n) {\n const calendar = injectCalendarContext(component);\n const { now, today, highlightedEventId } = calendar;\n\n provide(EVENT_CONTEXT, { event: () => toValue(event) });\n\n const isHighlighted = computed(() => highlightedEventId.value === toValue(event).id);\n const isEditable = computed(() => calendar.canEdit(toValue(event)));\n const isDragging = computed(() => calendar.isDragging(toValue(event)));\n\n const isPast = computed(() => {\n const { allDay, end, endDate } = toValue(event);\n\n return allDay\n ? Temporal.PlainDate.compare(endDate, today.value) < 0\n : Temporal.ZonedDateTime.compare(end as Temporal.ZonedDateTime, now.value) < 0;\n });\n\n function highlight() {\n highlightedEventId.value = toValue(event).id;\n }\n\n function unhighlight() {\n if (isHighlighted.value) {\n highlightedEventId.value = null;\n }\n }\n\n function onPointerdown(pointerEvent: PointerEvent) {\n calendar.startPointerDrag(pointerEvent, toValue(event), 'move');\n }\n\n function onKeydown(keyboardEvent: KeyboardEvent) {\n calendar.handleEventKeydown(\n keyboardEvent,\n toValue(event),\n toValue(interaction.axes),\n toValue(interaction.resourceId),\n );\n }\n\n return {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n };\n}\n\nexport function injectEventPrimitive(component: string): EventPrimitiveContext {\n const context = inject(EVENT_CONTEXT, null);\n\n if (!context) {\n throw new Error(`<${component}> must be used inside an event primitive.`);\n }\n\n return context;\n}\n","<script setup lang=\"ts\">\nimport type { EventSegment, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\n/**\n * Exposes its placement as CSS variables (column, span, and lane) rather than inline\n * geometry, so the recipe decides how bars are drawn.\n */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n segment: EventSegment<any>;\n /** How arrow keys move it once picked up; a month grid moves by days and weeks. */\n keyboardAxes?: KeyboardAxes;\n /** The resource row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n {\n as: 'div',\n keyboardAxes: () => ({ horizontal: 'day', vertical: 'week' }),\n resourceId: undefined,\n },\n);\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('EventBar', () => props.segment.event, {\n axes: () => props.keyboardAxes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-column': segment.column,\n '--event-span': segment.span,\n '--event-lane': segment.lane,\n }\"\n :data-event-id=\"segment.event.id\"\n :data-all-day=\"segment.event.allDay ? '' : undefined\"\n :data-continues-before=\"segment.continuesBefore ? '' : undefined\"\n :data-continues-after=\"segment.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"segment.event\"\n :segment=\"segment\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { EventSegment, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\n/**\n * Exposes its placement as CSS variables (column, span, and lane) rather than inline\n * geometry, so the recipe decides how bars are drawn.\n */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n segment: EventSegment<any>;\n /** How arrow keys move it once picked up; a month grid moves by days and weeks. */\n keyboardAxes?: KeyboardAxes;\n /** The resource row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n {\n as: 'div',\n keyboardAxes: () => ({ horizontal: 'day', vertical: 'week' }),\n resourceId: undefined,\n },\n);\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('EventBar', () => props.segment.event, {\n axes: () => props.keyboardAxes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-column': segment.column,\n '--event-span': segment.span,\n '--event-lane': segment.lane,\n }\"\n :data-event-id=\"segment.event.id\"\n :data-all-day=\"segment.event.allDay ? '' : undefined\"\n :data-continues-before=\"segment.continuesBefore ? '' : undefined\"\n :data-continues-after=\"segment.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"segment.event\"\n :segment=\"segment\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { injectEventPrimitive } from './useEventState.js';\n\n/**\n * Drags one edge of the event it sits in. Renders nothing unless the event is editable;\n * the recipe positions it (`data-edge` says which).\n */\nwithDefaults(defineProps<PrimitiveProps & { edge: 'start' | 'end' }>(), { as: 'span' });\n\nconst calendar = injectCalendarContext('EventResizeHandle');\nconst { event } = injectEventPrimitive('EventResizeHandle');\n</script>\n\n<template>\n <Primitive\n v-if=\"calendar.canEdit(event())\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n data-calendar-control\n :data-edge=\"edge\"\n @pointerdown=\"\n calendar.startPointerDrag(\n $event,\n event(),\n edge === 'start' ? 'resize-start' : 'resize-end',\n )\n \"\n @click.prevent.stop\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { injectEventPrimitive } from './useEventState.js';\n\n/**\n * Drags one edge of the event it sits in. Renders nothing unless the event is editable;\n * the recipe positions it (`data-edge` says which).\n */\nwithDefaults(defineProps<PrimitiveProps & { edge: 'start' | 'end' }>(), { as: 'span' });\n\nconst calendar = injectCalendarContext('EventResizeHandle');\nconst { event } = injectEventPrimitive('EventResizeHandle');\n</script>\n\n<template>\n <Primitive\n v-if=\"calendar.canEdit(event())\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n data-calendar-control\n :data-edge=\"edge\"\n @pointerdown=\"\n calendar.startPointerDrag(\n $event,\n event(),\n edge === 'start' ? 'resize-start' : 'resize-end',\n )\n \"\n @click.prevent.stop\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes `--axis-days` so the recipe can size the track and place bars, columns, and today. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Gantt');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-scale=\"calendar.gantt.value.scale\"\n :style=\"{ '--axis-days': calendar.gantt.value.axisDays }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :gantt=\"calendar.gantt.value\"\n :rows=\"calendar.gantt.value.rows\"\n :columns=\"calendar.gantt.value.columns\"\n :groups=\"calendar.gantt.value.groups\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes `--axis-days` so the recipe can size the track and place bars, columns, and today. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Gantt');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-scale=\"calendar.gantt.value.scale\"\n :style=\"{ '--axis-days': calendar.gantt.value.axisDays }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :gantt=\"calendar.gantt.value\"\n :rows=\"calendar.gantt.value.rows\"\n :columns=\"calendar.gantt.value.columns\"\n :groups=\"calendar.gantt.value.groups\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--bar-start` and `--bar-end`, in days from the start of the axis. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('GanttBar', () => props.row.event, {\n axes: { horizontal: 'day', vertical: 'none' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{ '--bar-start': row.startOffset, '--bar-end': row.endOffset }\"\n :data-event-id=\"row.event.id\"\n :data-continues-before=\"row.continuesBefore ? '' : undefined\"\n :data-continues-after=\"row.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"row.event\"\n :row=\"row\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--bar-start` and `--bar-end`, in days from the start of the axis. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('GanttBar', () => props.row.event, {\n axes: { horizontal: 'day', vertical: 'none' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{ '--bar-start': row.startOffset, '--bar-end': row.endOffset }\"\n :data-event-id=\"row.event.id\"\n :data-continues-before=\"row.continuesBefore ? '' : undefined\"\n :data-continues-after=\"row.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"row.event\"\n :row=\"row\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport { ganttLinkArrow, roundedPath, routeGanttLink, type GanttLink } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * An SVG overlay of the links between rows. Lay it over the rows (absolute, the same box)\n * inside the scrolled content: it measures the rendered bars, so it follows any zoom, row\n * height, or drag preview. The slot draws each link from its `path` and `arrow`.\n */\nconst props = withDefaults(\n defineProps<{\n /** How far a line runs straight out of a bar and into the next, in pixels. */\n gap?: number;\n radius?: number;\n arrowSize?: number;\n }>(),\n { gap: 12, radius: 6, arrowSize: 5 },\n);\n\nconst calendar = injectCalendarContext('GanttLinks');\n\nconst svg = ref<SVGSVGElement | null>(null);\n\ninterface MeasuredLink {\n link: GanttLink<any>;\n path: string;\n arrow: string;\n}\n\nconst measured = shallowRef<MeasuredLink[]>([]);\n\nconst find = (container: Element, attribute: string, id: string | number) =>\n container.querySelector(`[${attribute}=\"${CSS.escape(String(id))}\"]`);\n\nfunction measure() {\n const container = svg.value?.parentElement;\n\n if (!svg.value || !container) {\n return;\n }\n\n const origin = svg.value.getBoundingClientRect();\n\n measured.value = calendar.gantt.value.links.flatMap((link) => {\n const fromBar = find(container, 'data-event-id', link.from.event.id);\n const toBar = find(container, 'data-event-id', link.to.event.id);\n const fromRow = find(container, 'data-row-event-id', link.from.event.id);\n\n if (!fromBar || !toBar || !fromRow) {\n return [];\n }\n\n const fromRect = fromBar.getBoundingClientRect();\n const toRect = toBar.getBoundingClientRect();\n const rowRect = fromRow.getBoundingClientRect();\n const from = {\n x: fromRect.right - origin.left,\n y: fromRect.top + fromRect.height / 2 - origin.top,\n };\n const to = {\n x: toRect.left - origin.left,\n y: toRect.top + toRect.height / 2 - origin.top,\n };\n const gutterY = (to.y > from.y ? rowRect.bottom : rowRect.top) - origin.top;\n\n return [\n {\n link,\n path: roundedPath(\n routeGanttLink(from, to, { gap: props.gap, gutterY }),\n props.radius,\n ),\n arrow: ganttLinkArrow(to, props.arrowSize),\n },\n ];\n });\n}\n\nlet frame = 0;\n\nconst scheduleMeasure = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(measure);\n};\n\nlet observer: ResizeObserver | undefined;\n\nonMounted(() => {\n observer = new ResizeObserver(scheduleMeasure);\n\n if (svg.value?.parentElement) {\n observer.observe(svg.value.parentElement);\n }\n\n nextTick(scheduleMeasure);\n});\n\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame);\n observer?.disconnect();\n});\n\nwatch(calendar.gantt, () => nextTick(scheduleMeasure));\n\n/** A highlighted bar lights its own links and dims the rest. */\nconst links = computed(() => {\n const highlighted = calendar.highlightedEventId.value;\n\n return measured.value.map((item) => {\n const touches =\n highlighted !== null &&\n (item.link.from.event.id === highlighted || item.link.to.event.id === highlighted);\n\n return { ...item, highlighted: touches, dimmed: highlighted !== null && !touches };\n });\n});\n</script>\n\n<template>\n <svg\n ref=\"svg\"\n aria-hidden=\"true\"\n >\n <slot :links=\"links\" />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport { ganttLinkArrow, roundedPath, routeGanttLink, type GanttLink } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * An SVG overlay of the links between rows. Lay it over the rows (absolute, the same box)\n * inside the scrolled content: it measures the rendered bars, so it follows any zoom, row\n * height, or drag preview. The slot draws each link from its `path` and `arrow`.\n */\nconst props = withDefaults(\n defineProps<{\n /** How far a line runs straight out of a bar and into the next, in pixels. */\n gap?: number;\n radius?: number;\n arrowSize?: number;\n }>(),\n { gap: 12, radius: 6, arrowSize: 5 },\n);\n\nconst calendar = injectCalendarContext('GanttLinks');\n\nconst svg = ref<SVGSVGElement | null>(null);\n\ninterface MeasuredLink {\n link: GanttLink<any>;\n path: string;\n arrow: string;\n}\n\nconst measured = shallowRef<MeasuredLink[]>([]);\n\nconst find = (container: Element, attribute: string, id: string | number) =>\n container.querySelector(`[${attribute}=\"${CSS.escape(String(id))}\"]`);\n\nfunction measure() {\n const container = svg.value?.parentElement;\n\n if (!svg.value || !container) {\n return;\n }\n\n const origin = svg.value.getBoundingClientRect();\n\n measured.value = calendar.gantt.value.links.flatMap((link) => {\n const fromBar = find(container, 'data-event-id', link.from.event.id);\n const toBar = find(container, 'data-event-id', link.to.event.id);\n const fromRow = find(container, 'data-row-event-id', link.from.event.id);\n\n if (!fromBar || !toBar || !fromRow) {\n return [];\n }\n\n const fromRect = fromBar.getBoundingClientRect();\n const toRect = toBar.getBoundingClientRect();\n const rowRect = fromRow.getBoundingClientRect();\n const from = {\n x: fromRect.right - origin.left,\n y: fromRect.top + fromRect.height / 2 - origin.top,\n };\n const to = {\n x: toRect.left - origin.left,\n y: toRect.top + toRect.height / 2 - origin.top,\n };\n const gutterY = (to.y > from.y ? rowRect.bottom : rowRect.top) - origin.top;\n\n return [\n {\n link,\n path: roundedPath(\n routeGanttLink(from, to, { gap: props.gap, gutterY }),\n props.radius,\n ),\n arrow: ganttLinkArrow(to, props.arrowSize),\n },\n ];\n });\n}\n\nlet frame = 0;\n\nconst scheduleMeasure = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(measure);\n};\n\nlet observer: ResizeObserver | undefined;\n\nonMounted(() => {\n observer = new ResizeObserver(scheduleMeasure);\n\n if (svg.value?.parentElement) {\n observer.observe(svg.value.parentElement);\n }\n\n nextTick(scheduleMeasure);\n});\n\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame);\n observer?.disconnect();\n});\n\nwatch(calendar.gantt, () => nextTick(scheduleMeasure));\n\n/** A highlighted bar lights its own links and dims the rest. */\nconst links = computed(() => {\n const highlighted = calendar.highlightedEventId.value;\n\n return measured.value.map((item) => {\n const touches =\n highlighted !== null &&\n (item.link.from.event.id === highlighted || item.link.to.event.id === highlighted);\n\n return { ...item, highlighted: touches, dimmed: highlighted !== null && !touches };\n });\n});\n</script>\n\n<template>\n <svg\n ref=\"svg\"\n aria-hidden=\"true\"\n >\n <slot :links=\"links\" />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-row-event-id=\"row.event.id\"\n >\n <slot\n :row=\"row\"\n :event=\"row.event\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-row-event-id=\"row.event.id\"\n >\n <slot\n :row=\"row\"\n :event=\"row.event\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only when today is on the axis; exposes `--today` in days from its start. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttToday');\n</script>\n\n<template>\n <Primitive\n v-if=\"gantt.todayOffset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--today': gantt.todayOffset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only when today is on the axis; exposes `--today` in days from its start. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttToday');\n</script>\n\n<template>\n <Primitive\n v-if=\"gantt.todayOffset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--today': gantt.todayOffset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's day axis: drops and selections are measured against its width. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"dayaxis\"\n :data-axis-start=\"gantt.start.toString()\"\n :data-axis-days=\"gantt.axisDays\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's day axis: drops and selections are measured against its width. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"dayaxis\"\n :data-axis-start=\"gantt.start.toString()\"\n :data-axis-days=\"gantt.axisDays\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { startOfWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('MonthGrid');\n\nfunction targetFor(event: KeyboardEvent, from: Temporal.PlainDate): Temporal.PlainDate | null {\n const weekStartsOn = calendar.grid.value.weekdays[0].dayOfWeek as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return from.subtract({ days: 1 });\n case 'ArrowRight':\n return from.add({ days: 1 });\n case 'ArrowUp':\n return from.subtract({ weeks: 1 });\n case 'ArrowDown':\n return from.add({ weeks: 1 });\n case 'Home':\n return startOfWeek(from, weekStartsOn);\n case 'End':\n return startOfWeek(from, weekStartsOn).add({ days: 6 });\n case 'PageUp':\n return from.subtract(event.shiftKey ? { years: 1 } : { months: 1 });\n case 'PageDown':\n return from.add(event.shiftKey ? { years: 1 } : { months: 1 });\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a day cell, so arrows inside an event link or an input still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusDate(target);\n\n await nextTick();\n grid.querySelector<HTMLElement>(`[data-date=\"${target.toString()}\"]`)?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :weekdays=\"calendar.grid.value.weekdays\"\n :weeks=\"calendar.grid.value.weeks\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { startOfWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('MonthGrid');\n\nfunction targetFor(event: KeyboardEvent, from: Temporal.PlainDate): Temporal.PlainDate | null {\n const weekStartsOn = calendar.grid.value.weekdays[0].dayOfWeek as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return from.subtract({ days: 1 });\n case 'ArrowRight':\n return from.add({ days: 1 });\n case 'ArrowUp':\n return from.subtract({ weeks: 1 });\n case 'ArrowDown':\n return from.add({ weeks: 1 });\n case 'Home':\n return startOfWeek(from, weekStartsOn);\n case 'End':\n return startOfWeek(from, weekStartsOn).add({ days: 6 });\n case 'PageUp':\n return from.subtract(event.shiftKey ? { years: 1 } : { months: 1 });\n case 'PageDown':\n return from.add(event.shiftKey ? { years: 1 } : { months: 1 });\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a day cell, so arrows inside an event link or an input still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusDate(target);\n\n await nextTick();\n grid.querySelector<HTMLElement>(`[data-date=\"${target.toString()}\"]`)?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :weekdays=\"calendar.grid.value.weekdays\"\n :weeks=\"calendar.grid.value.weeks\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { MonthWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { week: MonthWeek<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{\n '--week-lanes': week.visibleLaneCount + (week.hasOverflow ? 1 : 0),\n '--week-visible-lanes': week.visibleLaneCount,\n }\"\n :data-overflow=\"week.hasOverflow ? '' : undefined\"\n >\n <slot\n :week=\"week\"\n :days=\"week.days\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { MonthWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { week: MonthWeek<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{\n '--week-lanes': week.visibleLaneCount + (week.hasOverflow ? 1 : 0),\n '--week-visible-lanes': week.visibleLaneCount,\n }\"\n :data-overflow=\"week.hasOverflow ? '' : undefined\"\n >\n <slot\n :week=\"week\"\n :days=\"week.days\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { date: Temporal.PlainDate }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('MonthWeekday');\n\nconst label = computed(() => props.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst longLabel = computed(() => props.date.toLocaleString(locale.value, { weekday: 'long' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"longLabel\"\n :data-weekend=\"date.dayOfWeek >= 6 ? '' : undefined\"\n >\n <slot\n :label=\"label\"\n :long-label=\"longLabel\"\n >{{ label }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { date: Temporal.PlainDate }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('MonthWeekday');\n\nconst label = computed(() => props.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst longLabel = computed(() => props.date.toLocaleString(locale.value, { weekday: 'long' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"longLabel\"\n :data-weekend=\"date.dayOfWeek >= 6 ? '' : undefined\"\n >\n <slot\n :label=\"label\"\n :long-label=\"longLabel\"\n >{{ label }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes, type TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only in today's column and inside the visible window; exposes `--now` in minutes. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { now, timeZone, timeGrid } = injectCalendarContext('NowIndicator');\n\nconst minutes = computed(\n () => wallMinutes(now.value.withTimeZone(timeZone.value)) - timeGrid.value.slotMinMinutes,\n);\n\nconst isVisible = computed(\n () => props.day.isToday && minutes.value >= 0 && minutes.value <= timeGrid.value.windowMinutes,\n);\n</script>\n\n<template>\n <Primitive\n v-if=\"isVisible\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': minutes }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes, type TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only in today's column and inside the visible window; exposes `--now` in minutes. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { now, timeZone, timeGrid } = injectCalendarContext('NowIndicator');\n\nconst minutes = computed(\n () => wallMinutes(now.value.withTimeZone(timeZone.value)) - timeGrid.value.slotMinMinutes,\n);\n\nconst isVisible = computed(\n () => props.day.isToday && minutes.value >= 0 && minutes.value <= timeGrid.value.windowMinutes,\n);\n</script>\n\n<template>\n <Primitive\n v-if=\"isVisible\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': minutes }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceCell, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n cell: ResourceCell<any>;\n /** Index of the row, for keyboard focus. */\n rowIndex: number;\n /** The resource's name, for the cell's accessible label. */\n resourceLabel?: string;\n /** The row's resource, null for the unassigned row, so drops and selections know it. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div' },\n);\n\nconst calendar = injectCalendarContext('ResourceCell');\n\nconst day = computed(() => calendar.resourceGrid.value.days[props.cell.column]);\n\nconst isFocused = computed(\n () =>\n props.rowIndex === calendar.focusedRow.value &&\n props.cell.date.equals(calendar.focusedDate.value),\n);\n\nconst label = computed(() => {\n const date = props.cell.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.cell.eventCount;\n const events = count ? `${count} ${count === 1 ? 'event' : 'events'}` : 'free';\n\n return [props.resourceLabel, date, events].filter(Boolean).join(', ');\n});\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n range.resourceId === props.resourceId &&\n Temporal.PlainDate.compare(props.cell.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.cell.date, range.endDate) <= 0\n );\n});\n\nfunction onFocus() {\n calendar.focusedRow.value = props.rowIndex;\n calendar.focusedDate.value = props.cell.date;\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :data-date=\"cell.date.toString()\"\n :data-row=\"rowIndex\"\n :data-today=\"day?.isToday ? '' : undefined\"\n :data-weekend=\"day?.isWeekend ? '' : undefined\"\n :data-busy=\"cell.eventCount ? '' : undefined\"\n :data-overlap=\"cell.eventCount > 1 ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n :data-resource-id=\"resourceId === undefined ? undefined : String(resourceId ?? '')\"\n @focus=\"onFocus\"\n >\n <slot\n :cell=\"cell\"\n :segments=\"cell.segments\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceCell, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n cell: ResourceCell<any>;\n /** Index of the row, for keyboard focus. */\n rowIndex: number;\n /** The resource's name, for the cell's accessible label. */\n resourceLabel?: string;\n /** The row's resource, null for the unassigned row, so drops and selections know it. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div' },\n);\n\nconst calendar = injectCalendarContext('ResourceCell');\n\nconst day = computed(() => calendar.resourceGrid.value.days[props.cell.column]);\n\nconst isFocused = computed(\n () =>\n props.rowIndex === calendar.focusedRow.value &&\n props.cell.date.equals(calendar.focusedDate.value),\n);\n\nconst label = computed(() => {\n const date = props.cell.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.cell.eventCount;\n const events = count ? `${count} ${count === 1 ? 'event' : 'events'}` : 'free';\n\n return [props.resourceLabel, date, events].filter(Boolean).join(', ');\n});\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n range.resourceId === props.resourceId &&\n Temporal.PlainDate.compare(props.cell.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.cell.date, range.endDate) <= 0\n );\n});\n\nfunction onFocus() {\n calendar.focusedRow.value = props.rowIndex;\n calendar.focusedDate.value = props.cell.date;\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :data-date=\"cell.date.toString()\"\n :data-row=\"rowIndex\"\n :data-today=\"day?.isToday ? '' : undefined\"\n :data-weekend=\"day?.isWeekend ? '' : undefined\"\n :data-busy=\"cell.eventCount ? '' : undefined\"\n :data-overlap=\"cell.eventCount > 1 ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n :data-resource-id=\"resourceId === undefined ? undefined : String(resourceId ?? '')\"\n @focus=\"onFocus\"\n >\n <slot\n :cell=\"cell\"\n :segments=\"cell.segments\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: ResourceDay }>(), { as: 'div' });\n\nconst { locale } = injectCalendarContext('ResourceDayHeader');\n\nconst weekday = computed(() => props.day.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"label\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n >\n <slot\n :day=\"day\"\n :weekday=\"weekday\"\n >{{ weekday }} {{ day.date.day }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: ResourceDay }>(), { as: 'div' });\n\nconst { locale } = injectCalendarContext('ResourceDayHeader');\n\nconst weekday = computed(() => props.day.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"label\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n >\n <slot\n :day=\"day\"\n :weekday=\"weekday\"\n >{{ weekday }} {{ day.date.day }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { navigate } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes the day count as `--day-count` so the recipe can size its columns. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('ResourceGrid');\n\nfunction targetFor(\n event: KeyboardEvent,\n date: Temporal.PlainDate,\n row: number,\n): { date: Temporal.PlainDate; row: number } | null {\n const lastRow = calendar.resourceGrid.value.rows.length - 1;\n const { start, end } = calendar.range.value;\n\n switch (event.key) {\n case 'ArrowLeft':\n return { date: date.subtract({ days: 1 }), row };\n case 'ArrowRight':\n return { date: date.add({ days: 1 }), row };\n case 'ArrowUp':\n return { date, row: Math.max(row - 1, 0) };\n case 'ArrowDown':\n return { date, row: Math.min(row + 1, lastRow) };\n case 'Home':\n return { date: event.ctrlKey ? date : start, row: event.ctrlKey ? 0 : row };\n case 'End':\n return { date: event.ctrlKey ? date : end, row: event.ctrlKey ? lastRow : row };\n case 'PageUp':\n return { date: navigate(date, calendar.view.value, -1), row };\n case 'PageDown':\n return { date: navigate(date, calendar.view.value, 1), row };\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a cell, so arrows inside an event link still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value, calendar.focusedRow.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusedRow.value = target.row;\n calendar.focusDate(target.date);\n\n await nextTick();\n grid.querySelector<HTMLElement>(\n `[data-row=\"${target.row}\"][data-date=\"${target.date.toString()}\"]`,\n )?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n :style=\"{ '--day-count': calendar.resourceGrid.value.days.length }\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.resourceGrid.value\"\n :days=\"calendar.resourceGrid.value.days\"\n :rows=\"calendar.resourceGrid.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { navigate } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes the day count as `--day-count` so the recipe can size its columns. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('ResourceGrid');\n\nfunction targetFor(\n event: KeyboardEvent,\n date: Temporal.PlainDate,\n row: number,\n): { date: Temporal.PlainDate; row: number } | null {\n const lastRow = calendar.resourceGrid.value.rows.length - 1;\n const { start, end } = calendar.range.value;\n\n switch (event.key) {\n case 'ArrowLeft':\n return { date: date.subtract({ days: 1 }), row };\n case 'ArrowRight':\n return { date: date.add({ days: 1 }), row };\n case 'ArrowUp':\n return { date, row: Math.max(row - 1, 0) };\n case 'ArrowDown':\n return { date, row: Math.min(row + 1, lastRow) };\n case 'Home':\n return { date: event.ctrlKey ? date : start, row: event.ctrlKey ? 0 : row };\n case 'End':\n return { date: event.ctrlKey ? date : end, row: event.ctrlKey ? lastRow : row };\n case 'PageUp':\n return { date: navigate(date, calendar.view.value, -1), row };\n case 'PageDown':\n return { date: navigate(date, calendar.view.value, 1), row };\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a cell, so arrows inside an event link still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value, calendar.focusedRow.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusedRow.value = target.row;\n calendar.focusDate(target.date);\n\n await nextTick();\n grid.querySelector<HTMLElement>(\n `[data-row=\"${target.row}\"][data-date=\"${target.date.toString()}\"]`,\n )?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n :style=\"{ '--day-count': calendar.resourceGrid.value.days.length }\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.resourceGrid.value\"\n :days=\"calendar.resourceGrid.value.days\"\n :rows=\"calendar.resourceGrid.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"rowheader\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :busy-days=\"row.busyDays\"\n :overlap-days=\"row.overlapDays\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"rowheader\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :busy-days=\"row.busyDays\"\n :overlap-days=\"row.overlapDays\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.busyDays ? undefined : ''\"\n :data-overlap=\"row.overlapDays ? '' : undefined\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :cells=\"row.cells\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.busyDays ? undefined : ''\"\n :data-overlap=\"row.overlapDays ? '' : undefined\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :cells=\"row.cells\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('TimeColumn');\n\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"label\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n data-drop=\"time\"\n >\n <slot\n :day=\"day\"\n :events=\"day.events\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('TimeColumn');\n\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"label\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n data-drop=\"time\"\n >\n <slot\n :day=\"day\"\n :events=\"day.events\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimedEventLayout } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/**\n * Exposes its placement as CSS variables in minutes and columns; with the grid's\n * `--window-minutes`, the recipe turns those into `top`, `height`, `left`, and `width`.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { layout: TimedEventLayout<any> }>(), {\n as: 'div',\n});\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimeEvent', () => props.layout.event, {\n axes: { horizontal: 'day', vertical: 'minutes' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': layout.startMinutes,\n '--event-end': layout.endMinutes,\n '--event-column': layout.column,\n '--event-columns': layout.columnCount,\n }\"\n :data-event-id=\"layout.event.id\"\n :data-starts-before=\"layout.startsBefore ? '' : undefined\"\n :data-ends-after=\"layout.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"layout.event\"\n :layout=\"layout\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimedEventLayout } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/**\n * Exposes its placement as CSS variables in minutes and columns; with the grid's\n * `--window-minutes`, the recipe turns those into `top`, `height`, `left`, and `width`.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { layout: TimedEventLayout<any> }>(), {\n as: 'div',\n});\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimeEvent', () => props.layout.event, {\n axes: { horizontal: 'day', vertical: 'minutes' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': layout.startMinutes,\n '--event-end': layout.endMinutes,\n '--event-column': layout.column,\n '--event-columns': layout.columnCount,\n }\"\n :data-event-id=\"layout.event.id\"\n :data-starts-before=\"layout.startsBefore ? '' : undefined\"\n :data-ends-after=\"layout.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"layout.event\"\n :layout=\"layout\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--day-count` and `--window-minutes` so the recipe can size columns and turn an\n * event's minutes into a position. Events inside are links, reached with Tab.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('TimeGrid');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--day-count': calendar.timeGrid.value.days.length,\n '--window-minutes': calendar.timeGrid.value.windowMinutes,\n '--all-day-lanes': calendar.timeGrid.value.allDay.laneCount,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.timeGrid.value\"\n :days=\"calendar.timeGrid.value.days\"\n :all-day=\"calendar.timeGrid.value.allDay\"\n :hours=\"calendar.timeGrid.value.hours\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--day-count` and `--window-minutes` so the recipe can size columns and turn an\n * event's minutes into a position. Events inside are links, reached with Tab.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('TimeGrid');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--day-count': calendar.timeGrid.value.days.length,\n '--window-minutes': calendar.timeGrid.value.windowMinutes,\n '--all-day-lanes': calendar.timeGrid.value.allDay.laneCount,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.timeGrid.value\"\n :days=\"calendar.timeGrid.value.days\"\n :all-day=\"calendar.timeGrid.value.allDay\"\n :hours=\"calendar.timeGrid.value.hours\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out in one day's hours. Renders only in that day's column;\n * exposes `--selection-start` and `--selection-end` in minutes from the top of the window.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeGrid } = injectCalendarContext('TimeSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n\n if (selected?.kind !== 'time' || !selected.startDate.equals(props.day.date)) return null;\n\n const offset = timeGrid.value.slotMinMinutes;\n\n return { start: selected.startMinutes! - offset, end: selected.endMinutes! - offset };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out in one day's hours. Renders only in that day's column;\n * exposes `--selection-start` and `--selection-end` in minutes from the top of the window.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeGrid } = injectCalendarContext('TimeSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n\n if (selected?.kind !== 'time' || !selected.startDate.equals(props.day.date)) return null;\n\n const offset = timeGrid.value.slotMinMinutes;\n\n return { start: selected.startMinutes! - offset, end: selected.endMinutes! - offset };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--axis-minutes`, `--window-minutes`, `--slot-minutes`, and `--slot-count` so the\n * recipe can size the track and turn an event's axis minutes into `left` and `width`.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Timeline');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--axis-minutes': calendar.timeline.value.axisMinutes,\n '--window-minutes': calendar.timeline.value.windowMinutes,\n '--slot-minutes': calendar.timeline.value.slotMinutes,\n '--slot-count':\n calendar.timeline.value.axisMinutes / calendar.timeline.value.slotMinutes,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :timeline=\"calendar.timeline.value\"\n :days=\"calendar.timeline.value.days\"\n :rows=\"calendar.timeline.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--axis-minutes`, `--window-minutes`, `--slot-minutes`, and `--slot-count` so the\n * recipe can size the track and turn an event's axis minutes into `left` and `width`.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Timeline');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--axis-minutes': calendar.timeline.value.axisMinutes,\n '--window-minutes': calendar.timeline.value.windowMinutes,\n '--slot-minutes': calendar.timeline.value.slotMinutes,\n '--slot-count':\n calendar.timeline.value.axisMinutes / calendar.timeline.value.slotMinutes,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :timeline=\"calendar.timeline.value\"\n :days=\"calendar.timeline.value.days\"\n :rows=\"calendar.timeline.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceId, TimelineItem } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--event-start`, `--event-end` (axis minutes), and `--event-lane`. */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n item: TimelineItem<any>;\n /** The row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div', resourceId: undefined },\n);\n\nconst calendar = injectCalendarContext('TimelineEvent');\n\n/** Left and right move along the hours; up and down move between resource rows. */\nconst axes = computed(() => ({\n horizontal: 'minutes' as const,\n vertical: 'resource' as const,\n resourceOrder: calendar.timeline.value.rows.map((row) => row.resource?.id ?? null),\n}));\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimelineEvent', () => props.item.event, {\n axes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': item.startOffset,\n '--event-end': item.endOffset,\n '--event-lane': item.lane,\n }\"\n :data-event-id=\"item.event.id\"\n :data-all-day=\"item.event.allDay ? '' : undefined\"\n :data-starts-before=\"item.startsBefore ? '' : undefined\"\n :data-ends-after=\"item.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"item.event\"\n :item=\"item\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceId, TimelineItem } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--event-start`, `--event-end` (axis minutes), and `--event-lane`. */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n item: TimelineItem<any>;\n /** The row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div', resourceId: undefined },\n);\n\nconst calendar = injectCalendarContext('TimelineEvent');\n\n/** Left and right move along the hours; up and down move between resource rows. */\nconst axes = computed(() => ({\n horizontal: 'minutes' as const,\n vertical: 'resource' as const,\n resourceOrder: calendar.timeline.value.rows.map((row) => row.resource?.id ?? null),\n}));\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimelineEvent', () => props.item.event, {\n axes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': item.startOffset,\n '--event-end': item.endOffset,\n '--event-lane': item.lane,\n }\"\n :data-event-id=\"item.event.id\"\n :data-all-day=\"item.event.allDay ? '' : undefined\"\n :data-starts-before=\"item.startsBefore ? '' : undefined\"\n :data-ends-after=\"item.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"item.event\"\n :item=\"item\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only while now falls inside a visible day's window; exposes `--now` in axis minutes. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { now, timeZone, timeline } = injectCalendarContext('TimelineNow');\n\nconst offset = computed(() => {\n const local = now.value.withTimeZone(timeZone.value);\n const day = timeline.value.days.find((candidate) => candidate.date.equals(local.toPlainDate()));\n const minutes = wallMinutes(local) - timeline.value.slotMinMinutes;\n\n if (!day || minutes < 0 || minutes > timeline.value.windowMinutes) {\n return null;\n }\n\n return day.offset + minutes;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"offset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': offset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only while now falls inside a visible day's window; exposes `--now` in axis minutes. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { now, timeZone, timeline } = injectCalendarContext('TimelineNow');\n\nconst offset = computed(() => {\n const local = now.value.withTimeZone(timeZone.value);\n const day = timeline.value.days.find((candidate) => candidate.date.equals(local.toPlainDate()));\n const minutes = wallMinutes(local) - timeline.value.slotMinMinutes;\n\n if (!day || minutes < 0 || minutes > timeline.value.windowMinutes) {\n return null;\n }\n\n return day.offset + minutes;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"offset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': offset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"row.resource ? undefined : 'Unassigned'\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.items.length ? undefined : ''\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :items=\"row.items\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"row.resource ? undefined : 'Unassigned'\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.items.length ? undefined : ''\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :items=\"row.items\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { daysBetween, type TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out along a row's hours. Renders only in that row; exposes\n * `--selection-start` and `--selection-end` in axis minutes.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeline, resources } = injectCalendarContext('TimelineSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n const rowResource = resources.value ? (props.row.resource?.id ?? null) : undefined;\n\n if (selected?.kind !== 'axis' || selected.resourceId !== rowResource) return null;\n\n const { start, windowMinutes, slotMinMinutes } = timeline.value;\n const toAxis = (date: Temporal.PlainDate, minutes: number) =>\n daysBetween(start, date) * windowMinutes + minutes - slotMinMinutes;\n\n return {\n start: toAxis(selected.startDate, selected.startMinutes!),\n end: toAxis(selected.endDate, selected.endMinutes!),\n };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { daysBetween, type TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out along a row's hours. Renders only in that row; exposes\n * `--selection-start` and `--selection-end` in axis minutes.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeline, resources } = injectCalendarContext('TimelineSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n const rowResource = resources.value ? (props.row.resource?.id ?? null) : undefined;\n\n if (selected?.kind !== 'axis' || selected.resourceId !== rowResource) return null;\n\n const { start, windowMinutes, slotMinMinutes } = timeline.value;\n const toAxis = (date: Temporal.PlainDate, minutes: number) =>\n daysBetween(start, date) * windowMinutes + minutes - slotMinMinutes;\n\n return {\n start: toAxis(selected.startDate, selected.startMinutes!),\n end: toAxis(selected.endDate, selected.endMinutes!),\n };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's time axis: events, selections, and drops are measured against its width. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { timeline, resources } = injectCalendarContext('TimelineTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"axis\"\n :data-axis-minutes=\"timeline.axisMinutes\"\n :data-resource-id=\"resources ? String(props.row.resource?.id ?? '') : undefined\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's time axis: events, selections, and drops are measured against its width. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { timeline, resources } = injectCalendarContext('TimelineTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"axis\"\n :data-axis-minutes=\"timeline.axisMinutes\"\n :data-resource-id=\"resources ? String(props.row.resource?.id ?? '') : undefined\"\n >\n <slot />\n </Primitive>\n</template>\n"],"mappings":";;;;AAkGA,IAAMkO,KAAiB,GAEjBC,IAAY;AAElB,SAAgBC,EAA8C,GAAgC;CAC1F,IAAMC,IAAOC,EAAgC,IAAI,GAC3CC,IAAYD,EAA+D,IAAI,GAC/EE,IAAeC,EAAI,EAAE,GAErBC,IAAWC,QAAeC,EAAQC,EAAQ,QAAQ,KAAK,EAAK,GAC5DC,IAAaH,QAAeC,EAAQC,EAAQ,UAAU,KAAK,EAAK,GAChEE,IAAOJ,QAAeC,EAAQC,EAAQ,WAAW,KAAK,EAAE,GACxDG,IAAUL,QAAeC,EAAQC,EAAQ,cAAc,KAAK,CAAC,GAC7DI,IAAUN,QAAeC,EAAQC,EAAQ,cAAc,KAAK,IAAO;CAEzE,SAASK,EAAQ,GAAkC;EAC/C,OAAOR,EAAS,UAAUG,EAAQ,UAAUM,EAAM,MAAM,KAAK;CACjE;CAEA,SAASC,EAAsB,GAA0D;EACrF,IAAIC,MAAU,KAAA,GAAW;EACzB,IAAIA,MAAU,IAAI,OAAO;EAEzB,IAAMC,KAASV,EAAQC,EAAQ,SAAS,KAAK,CAAC,EAAA,CAAG,MAC5C,MAAa,OAAOU,EAAS,EAAE,MAAMF,CAC1C;EAEA,OAAOC,IAAQA,EAAM,KAAKD;CAC9B;CAGA,SAASG,EAAc,GAAW,GAA8B;EAC5D,KAAK,IAAMC,KAAW,SAAS,kBAAkBC,GAAGC,CAAC,GAAG;GAEpD,IAAKF,EAAwB,QAAQ,iBAAiB,GAAG;GAEzD,IAAMG,IAAQH,EAAwB,QAAqB,aAAa;GAExE,IAAI,CAACG,GAAM;GAEX,IAAMC,IAAOD,EAAK,QAAQ,MACpBE,IAAaV,EAAsBQ,EAAK,QAAQ,UAAU,GAC1DG,IAAOH,EAAK,sBAAsB,GAClCI,IAASf,EAAQ,QAAQD,EAAQ;GAGvC,IAAIa,MAAS,WAAW;IACpB,IAAMI,IAAW,OAAOL,EAAK,QAAQ,QAAQ,GACvCM,IAAQ,KAAK,IAAI,KAAK,KAAKR,IAAIK,EAAK,QAAQA,EAAK,OAAO,CAAC,GAAG,KAAM;IAExE,OAAO;KACH;KACA,MAAM,SAAS,UAAU,KAAKH,EAAK,QAAQ,SAAU,CAAC,CAAC,IAAI,EACvD,MAAM,KAAK,MAAMM,IAAQD,CAAQ,EACrC,CAAC;KACD,SAAS;KACT;IACJ;GACJ;GAEA,IAAIJ,MAAS,QAAQ;IACjB,IAAMM,IAAc,OAAOP,EAAK,QAAQ,WAAW,GAC7CM,IACF,KAAK,IAAI,KAAK,KAAKR,IAAIK,EAAK,QAAQA,EAAK,OAAO,CAAC,GAAG,KAAM,IAAII,GAC5DC,IAAW,KAAK,MAAMF,IAAQF,CAAM;IAE1C,OAAO;KACH;KACA,MAAMnB,EAAQ,WAAW,MAAM,IAAI,EAAE,MAAMuB,EAAS,CAAC;KACrD,SAASpB,EAAQ,SAASkB,IAAQE,IAAWJ;KAC7C;IACJ;GACJ;GAEA,IAAMK,IAAO,SAAS,UAAU,KAAKT,EAAK,QAAQ,IAAK;GAEvD,IAAIC,MAAS,QAAQ;IACjB,IAAMS,IAAW,KAAK,IAAI,KAAK,KAAKX,IAAII,EAAK,OAAOA,EAAK,QAAQ,CAAC,GAAG,CAAC;IAEtE,OAAO;KAAE;KAAM;KAAM,SAASf,EAAQ,QAAQsB,IAAWN;KAAQ;IAAW;GAChF;GAEA,OAAO;IAAE;IAAM;IAAM,SAAS;IAAM;GAAW;EACnD;EAEA,OAAO;CACX;CAEA,SAASO,EAAa,GAAoB,GAAgC;EAOtE,OAAO;GAAE,MANIC,EAAYC,EAAO,MAAMC,EAAO,IAMpC;GAAM,SAJXD,EAAO,YAAY,QAAQC,EAAO,YAAY,OACxCC,GAAYD,EAAO,UAAUD,EAAO,SAAS1B,EAAK,KAAK,IACvD;EAEa;CAC3B;CAEA,SAAS6B,EAAU,GAAqB,GAAoB;EACxD,IAAMC,IAAQN,EAAaO,EAAM,QAAQJ,CAAM,GACzCK,IACFD,EAAM,SAAS,SACTE,EAAUF,EAAM,OAAOD,CAAK,IAC5BI,EACIH,EAAM,OACNA,EAAM,SAAS,iBAAiB,UAAU,OAC1CD,GACA9B,EAAK,KACT,GACJe,IACFgB,EAAM,SAAS,UACfJ,EAAO,eAAe,KAAA,KACtBI,EAAM,OAAO,eAAe,KAAA,IACtBJ,EAAO,aACPI,EAAM,OAAO;EAEvB,EAAK,QAAQ;GAAE,GAAGA;GAAO,SAAS;GAAM;GAAS;EAAW;CAChE;CAGA,IAAMI,IAAgBvC,QAAe;EACjC,IAAMmC,IAAQzC,EAAK;EAInB,OAFKyC,GAAO,UAELjC,EAAQ,OAAO,MAAM,KAAK,MAC7BM,EAAM,OAAO2B,EAAM,MAAM,KAAKK,EAAUhC,GAAO2B,EAAM,OAAO,IAAI3B,CACpE,IAJ4BN,EAAQ,OAAO;CAK/C,CAAC;CAGD,SAASuC,EAAmB,GAAoD;EAC5E,IAAMC,IAAMxC,EAAQ,iBAAiBM,CAAK,GACpC2B,IAAQzC,EAAK;EAEnB,IACI,CAACyC,GAAO,WACRA,EAAM,MAAM,WAAW3B,KACvB2B,EAAM,eAAeA,EAAM,OAAO,YAElC,OAAOO;EAGX,IAAMC,KAAUD,KAAO,CAAC,EAAA,CAAG,QAAQ,MAAOE,MAAOT,EAAM,OAAO,UAAU;EAExE,OAAOA,EAAM,eAAe,QAAQA,EAAM,eAAe,KAAA,IACnDQ,IACA,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAGA,GAAQR,EAAM,UAAU,CAAC,CAAC;CACpD;CAEA,SAASU,EAAW,GAAkC;EAClD,OAAO,GAAQnD,EAAK,OAAO,WAAWA,EAAK,MAAM,MAAM,OAAOc,EAAM;CACxE;CAEA,SAASsC,EAAQ,GAA8B;EAC3C,OACI,CAACX,EAAM,QAAQ,MAAM,OAAOA,EAAM,MAAM,KAAc,KACtD,CAACA,EAAM,QAAQ,IAAI,OAAOA,EAAM,MAAM,GAAY,KAClDA,EAAM,eAAeA,EAAM,OAAO;CAE1C;CAEA,SAASY,EAAO,GAAqB;EACjC,IAAI,CAACD,EAAQX,CAAK,GAAG;EAErB,IAAMa,IAA6B;GAC/B,OAAOb,EAAM,MAAM;GACnB,OAAOA,EAAM,QAAQ;GACrB,KAAKA,EAAM,QAAQ;GACnB,eAAeA,EAAM,MAAM;GAC3B,aAAaA,EAAM,MAAM;GACzB,QAAQA,EAAM,MAAM;EACxB;EAOA,AALIA,EAAM,eAAeA,EAAM,OAAO,eAClC,EAAO,aAAaA,EAAM,YAC1B,EAAO,qBAAqBA,EAAM,OAAO,aAGzCA,EAAM,SAAS,SACfjC,EAAQ,cAAc8C,CAAM,IAE5B9C,EAAQ,gBAAgB8C,CAAM;CAEtC;CAEA,SAASC,IAAmB;EACxB,IAAMC,KAAW,MAAsB;GAEnC,AADA1C,EAAM,eAAe,GACrBA,EAAM,gBAAgB;EAC1B;EAIA,AAFA,OAAO,iBAAiB,SAAS0C,GAAS;GAAE,SAAS;GAAM,MAAM;EAAK,CAAC,GAEvE,iBAAiB,OAAO,oBAAoB,SAASA,GAAS,EAAE,SAAS,GAAK,CAAC,GAAG,CAAC;CACvF;CAEA,SAASC,EAAiB,GAA4B,GAAyB,GAAgB;EAC3F,IAAIC,EAAa,WAAW,KAAKA,EAAa,gBAAgB,WAAW,CAAC7C,EAAQC,CAAK,GACnF;EAEJ,IAAMsB,IAASjB,EAAcuC,EAAa,SAASA,EAAa,OAAO;EAEvE,IAAI,CAACtB,GAAQ;EASb,AANAsB,EAAa,eAAe,GAExBlC,MAAS,UACTkC,EAAa,gBAAgB,GAGjC,EAAK,QAAQ;GACT;GACA;GACA;GACA,SAAS;GACT,UAAU;GACV,SAAS;IAAE,GAAGA,EAAa;IAAS,GAAGA,EAAa;GAAQ;GAC5D,SAAS;IAAE,OAAO5C,EAAM;IAAO,KAAKA,EAAM;GAAI;GAC9C,YAAYsB,EAAO;GACnB,WAAW,CAAC;GACZ,UAAU,CAAC;EACf;EAEA,IAAMuB,KAAU,MAAuB;GACnC,IAAMlB,IAAQzC,EAAK;GAEnB,IAAI,CAACyC,GAAO;GAEZ,IAAMmB,IAAW,KAAK,MAClBC,EAAK,UAAUpB,EAAM,QAAQ,GAC7BoB,EAAK,UAAUpB,EAAM,QAAQ,CACjC;GAEA,IAAI,CAACA,EAAM,WAAWmB,IAAW/D,IAAgB;GAEjD,IAAMwC,IAASlB,EAAc0C,EAAK,SAASA,EAAK,OAAO;GAEvD,AAAIxB,KACAE,EAAUE,GAAOJ,CAAM;EAE/B,GAEMyB,KAAU,MAAuB;GAInC,AAHA,OAAO,oBAAoB,eAAeH,CAAM,GAChD,OAAO,oBAAoB,aAAaI,CAAI,GAC5C,OAAO,oBAAoB,iBAAiBC,CAAQ,GACpD,OAAO,oBAAoB,WAAWC,CAAQ;GAE9C,IAAMxB,IAAQzC,EAAK;GAGnB,AAFA,EAAK,QAAQ,MAETyC,GAAO,YACPc,EAAiB,GAEZW,KAAWb,EAAOZ,CAAK;EAEpC,GAEMsB,UAAaD,EAAO,EAAK,GACzBE,UAAiBF,EAAO,EAAI,GAC5BG,KAAY,MAAuBE,EAAI,QAAQ,YAAYL,EAAO,EAAI;EAK5E,AAHA,OAAO,iBAAiB,eAAeH,CAAM,GAC7C,OAAO,iBAAiB,aAAaI,CAAI,GACzC,OAAO,iBAAiB,iBAAiBC,CAAQ,GACjD,OAAO,iBAAiB,WAAWC,CAAQ;CAC/C;CAEA,SAASG,EAAe,GAA4B;EAChD,IAAMhD,IAAUsC,EAAa;EAE7B,IACI,CAACjD,EAAW,SACZiD,EAAa,WAAW,KACxBA,EAAa,gBAAgB,WAC7BtC,GAAS,QAAQ,0CAA0C,GAE3D;EAGJ,IAAMiD,IAASlD,EAAcuC,EAAa,SAASA,EAAa,OAAO;EAEvE,IAAI,CAACW,GAAQ;EAKb,AAFAX,EAAa,eAAe,GAC5BtC,GAAS,QAAqB,qBAAmB,CAAC,EAAE,MAAM,GAC1D,EAAU,QAAQ;GAAE;GAAQ,SAASiD;EAAO;EAE5C,IAAMV,KAAU,MAAuB;GACnC,IAAMtB,IAASlB,EAAc0C,EAAK,SAASA,EAAK,OAAO;GAEvD,AAAIxB,KAAUA,EAAO,SAASgC,EAAO,SACjC,EAAU,QAAQ;IAAE;IAAQ,SAAShC;GAAO;EAEpD,GAEMyB,KAAU,MAAuB;GAInC,AAHA,OAAO,oBAAoB,eAAeH,CAAM,GAChD,OAAO,oBAAoB,aAAaI,CAAI,GAC5C,OAAO,oBAAoB,iBAAiBC,CAAQ,GACpD,OAAO,oBAAoB,WAAWC,CAAQ;GAE9C,IAAMK,IAAQC,EAAc;GAG5B,AAFA,EAAU,QAAQ,MAEd,CAACL,KAAaI,KACd9D,EAAQ,gBAAgB8D,EAAM,MAAM;EAE5C,GAEMP,UAAaD,EAAO,EAAK,GACzBE,UAAiBF,EAAO,EAAI,GAC5BG,KAAY,MAAuBE,EAAI,QAAQ,YAAYL,EAAO,EAAI;EAK5E,AAHA,OAAO,iBAAiB,eAAeH,CAAM,GAC7C,OAAO,iBAAiB,aAAaI,CAAI,GACzC,OAAO,iBAAiB,iBAAiBC,CAAQ,GACjD,OAAO,iBAAiB,WAAWC,CAAQ;CAC/C;CAEA,IAAMO,KAAW,GAA0B,MACvCxC,EAAK,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAQ,CAAC,CAAC,CAAC,gBAAgBxB,EAAQ,SAAS,KAAK,GAMvF+D,IAAgBjE,QAAe;EACjC,IAAMmE,IAAUvE,EAAU;EAE1B,IAAI,CAACuE,GAAS,OAAO;EAErB,IAAM,EAAE,cAAWA;EAEnB,IAAIJ,EAAO,SAAS,SAASA,EAAO,SAAS,WAAW;GACpD,IAAM,CAACK,GAAWC,KAAWC,EAAaP,EAAO,MAAMI,EAAQ,QAAQ,IAAI;GAE3E,OAAO;IACH,MAAMJ,EAAO;IACb,YAAYA,EAAO;IACnB;IACA;IACA,QAAQ;KACJ,OAAOK;KACP,KAAKC;KACL,QAAQ;KACR,YAAYN,EAAO;IACvB;GACJ;EACJ;EAEA,IAAMQ,IAAOnE,EAAK,OACZoE,KAAY,MACd3C,EAAY3B,EAAQ,WAAW,OAAO6B,EAAO,IAAI,IAAI,KAAK,KAAKA,EAAO,SACpE0C,IAAUV,EAAO,SAAS,QAC1B,CAACW,GAAKC,KAAQL,EAChBG,IAAUV,EAAO,UAAWS,EAAST,CAAM,GAC3CU,IAAUN,EAAQ,QAAQ,UAAWK,EAASL,EAAQ,OAAO,CACjE,GACMS,IAAU,KAAK,MAAMF,IAAMH,CAAI,IAAIA,GACnCM,IAAQ,KAAK,IAAI,KAAK,KAAKF,IAAOJ,CAAI,IAAIA,GAAMK,IAAUL,CAAI,GAE9DH,IAAYK,IACZV,EAAO,OACP7D,EAAQ,WAAW,MAAM,IAAI,EAAE,MAAM,KAAK,MAAM0E,IAAU,IAAI,EAAE,CAAC,GACjEE,IAAeL,IAAUG,IAAUA,IAAU,MAC7CP,IAAUI,IACVV,EAAO,OACP7D,EAAQ,WAAW,MAAM,IAAI,EAAE,MAAM,KAAK,MAAM2E,IAAQ,IAAI,EAAE,CAAC,GAC/DE,IAAaN,IAAUI,IAAQA,IAAQ;EAE7C,OAAO;GACH,MAAMd,EAAO;GACb,YAAYA,EAAO;GACnB;GACA;GACA;GACA;GACA,QAAQ;IACJ,OAAOG,EAAQE,GAAWU,CAAY;IACtC,KAAKZ,EAAQG,GAASU,CAAU;IAChC,QAAQ;IACR,YAAYhB,EAAO;GACvB;EACJ;CACJ,CAAC;CAED,SAASiB,EAAS,GAA2B;EACzC,IAAMC,KAAU,MACZvE,aAAiB,SAAS,YACpBA,EAAM,eAAeR,EAAQ,OAAO,OAAO;GACvC,SAAS;GACT,OAAO;GACP,KAAK;EACT,CAAC,IACDQ,EAAM,eAAeR,EAAQ,OAAO,OAAO;GACvC,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,QAAQ;EACZ,CAAC;EAEX,OAAO,GAAG+E,EAAOC,EAAM,KAAK,EAAE,MAAMD,EAAOC,EAAM,GAAG;CACxD;CAEA,eAAeC,EAAQ,GAAyB;EAC5C,MAAMC,EAAS;EAEf,IAAMtE,IAAU,SAAS,cACrB,mBAAmB,IAAI,OAAO,OAAON,EAAM,EAAE,CAAC,EAAE,GACpD;EAKA,CAJeM,GAAS,QAAQtB,CAAS,IACnCsB,IACAA,GAAS,cAA2BtB,CAAS,EAAA,EAE3C,MAAM;CAClB;CAEA,SAAS6F,EAAgB,GAAmC;EACxD,IAAMC,IAAQjD,EAAUF,EAAM,OAAOA,EAAM,SAAS,GAC9CC,IACFD,EAAM,SAAS,QAAQA,EAAM,SAAS,UAChCG,EAAYE,EAAUL,EAAM,OAAOmD,CAAK,GAAG,OAAOnD,EAAM,UAAU/B,EAAK,KAAK,IAC5EkF;EAEV,OAAO;GAAE,GAAGnD;GAAO;EAAQ;CAC/B;CAEA,IAAIoD,IAAuC;CAE3C,SAASC,IAAkB;EAEvB,AADAD,IAAkB,GAClB,IAAkB;CACtB;CAEA,EAAeC,CAAe;CAE9B,SAASC,EAAc,GAA8B;EACjD,IAAMtD,IAAQzC,EAAK;EAEnB,IAAI,CAACyC,GAAO,UAAU;GAClB,EAAgB;GAEhB;EACJ;EAEA,IAAM3B,IAAQ2B,EAAM,OACduD,IAAOvD,EAAM;EAEnB,IAAIwD,EAAc,QAAQ,UAAU;GAMhC,AALAA,EAAc,eAAe,GAC7BA,EAAc,gBAAgB,GAC9B,EAAK,QAAQ,MACbH,EAAgB,GAChB,EAAa,QAAQ,mBACrBL,EAAQ3E,CAAK;GAEb;EACJ;EAEA,IAAImF,EAAc,QAAQ,OAAOA,EAAc,QAAQ,SAAS;GAU5D,AATAA,EAAc,eAAe,GAC7BA,EAAc,gBAAgB,GAC9B,EAAK,QAAQ,MACbH,EAAgB,GAChBzC,EAAO;IACH,GAAGZ;IACH,MAAMA,EAAM,SAAS,QAAQA,EAAM,SAAS,UAAU,eAAe;GACzE,CAAC,GACD,EAAa,QAAQ,YAAY6C,EAAS7C,EAAM,OAAO,EAAE,IACzDgD,EAAQ3E,CAAK;GAEb;EACJ;EAQA,IAAMoF,IAAY;GALd,WAAW,CAAC,IAAI,YAAY;GAC5B,YAAY,CAAC,GAAG,YAAY;GAC5B,SAAS,CAAC,IAAI,UAAU;GACxB,WAAW,CAAC,GAAG,UAAU;EAEX,EAAWD,EAAc;EAE3C,IAAI,CAACC,GAAW;EAGhB,AADAD,EAAc,eAAe,GAC7BA,EAAc,gBAAgB;EAE9B,IAAM,CAACE,GAAMC,KAAQF,GACfG,IAAOD,MAAS,eAAeJ,EAAK,aAAaA,EAAK,UACtDM,IAAWL,EAAc,UACzBzD,IAAQ,EAAE,GAAI8D,IAAW7D,EAAM,WAAWA,EAAM,UAAW,GAC3DoC,IAAO/D,EAAM,SAAS,IAAIJ,EAAK,OACjC6F,IAAqB9D;EAEzB,IAAI4D,MAAS,OACT,EAAM,QAAQ7D,EAAM,QAAQ,KAAK2D;OAC9B,IAAIE,MAAS,QAChB,EAAM,QAAQ7D,EAAM,QAAQ,KAAK2D,IAAO;OACrC,IAAIE,MAAS,aAAaxB,GAC7B,EAAM,WAAWrC,EAAM,WAAW,KAAK2D,IAAOtB;OAC3C,IAAIwB,MAAS,cAAcL,EAAK,iBAAiB,CAACM,GAAU;GAC/D,IAAME,IAAQR,EAAK,eACbS,IAAQD,EAAM,QAAQ/D,EAAM,cAAc,IAAI;GAEpD,IAAO;IACH,GAAGA;IACH,YAAY+D,EAAM,KAAK,IAAI,KAAK,IAAIC,IAAQN,GAAM,CAAC,GAAGK,EAAM,SAAS,CAAC;GAC1E;EACJ,OACI;EAUJ,AAPIH,MAAS,eACT,IAAOC,IAAW;GAAE,GAAGC;GAAM,UAAU/D;EAAM,IAAI;GAAE,GAAG+D;GAAM,WAAW/D;EAAM,IAGjF,IAAOmD,EAAgBY,CAAI,GAC3B,EAAK,QAAQA,GACb,EAAa,QAAQjB,EAASiB,EAAK,OAAO,GAC1Cd,EAAQ3E,CAAK;CACjB;CAOA,SAAS4F,EACL,GACA,GACA,GACA,GACF;EACE,AAAIT,EAAc,QAAQ,OAAO,GAAK,SAAUpF,EAAQC,CAAK,MAE7DmF,EAAc,eAAe,GAC7B,EAAK,QAAQ;GACT,MAAM;GACN;GACA,QAAQ;IAAE,MAAM;IAAO,MAAMnF,EAAM;IAAW,SAAS;IAAM;GAAW;GACxE,SAAS;GACT,UAAU;GACV,SAAS;IAAE,GAAG;IAAG,GAAG;GAAE;GACtB,SAAS;IAAE,OAAOA,EAAM;IAAO,KAAKA,EAAM;GAAI;GAC9C;GACA,WAAW;IAAE,MAAM;IAAG,SAAS;GAAE;GACjC,UAAU;IAAE,MAAM;IAAG,SAAS;GAAE;GAChC;EACJ,GACA,EAAa,QACT,qGAEJ,OAAO,iBAAiB,WAAWiF,GAAe,EAAE,SAAS,GAAK,CAAC,GACnE,UACI,OAAO,oBAAoB,WAAWA,GAAe,EAAE,SAAS,GAAK,CAAC;CAC9E;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;;AC3lBA,SAAgBY,EAA0C,GAAgC;CACtF,IAAM,EAAE,YAASnG,GACXoG,IAAOtG,QAAeC,EAAQC,EAAQ,IAAI,KAAK,OAAO,GACtDqG,IAAevG,QAAeC,EAAQC,EAAQ,YAAY,KAAK,CAAC,GAChEsG,IAAWxG,QAAeC,EAAQC,EAAQ,QAAQ,KAAKuG,EAAc,CAAC,GACtEC,IAAS1G,QAAeC,EAAQC,EAAQ,MAAM,CAAC,GAC/CyG,IAAM7G,EAAI,SAAS,IAAI,iBAAiB0G,EAAS,KAAK,CAAC;CAG7D,IAAI,OAAO,SAAW,KAAa;EAC/B,IAAMI,IAAS,kBACJ,EAAI,QAAQ,SAAS,IAAI,iBAAiBJ,EAAS,KAAK,GAC/D,GACJ;EAEA,QAAqB,cAAcI,CAAM,CAAC;CAC9C;CAEA,IAAMC,IAAQ7G,QACJC,EAAQC,EAAQ,KAAK,KAAKyG,EAAI,MAAM,aAAaH,EAAS,KAAK,CAAC,CAAC,YAAY,CACvF,GACMM,IAAchH,EAAI4B,EAAK,KAAK,GAE5BqF,IAAqBjH,EAA4B,IAAI,GAErDkH,IAAShH,QACXiH,EAAgBhH,EAAQC,EAAQ,MAAM,KAAK,CAAC,GAAG,EAAE,UAAUsG,EAAS,MAAM,CAAC,CAC/E,GAGMxC,IAAQhE,QAAekH,EAAYxF,EAAK,OAAO4E,EAAK,OAAOC,EAAa,KAAK,CAAC,GAE9EY,IAAe1H,EAAmB;EACpC;EACA,WAAWS,EAAQ;EACnB,gBAAgBA,EAAQ;EACxB;EACA;EACA,YAAYF,QAAegE,EAAM,MAAM,KAAK;EAC5C,gBAAgB9D,EAAQ;EACxB,gBAAgBA,EAAQ;EACxB,UAAUA,EAAQ;EAClB,YAAYA,EAAQ;EACpB,aAAaA,EAAQ;EACrB,SAASA,EAAQ;EACjB,aAAaA,EAAQ;EACrB,eAAeA,EAAQ;EACvB,eAAeA,EAAQ;CAC3B,CAAC,GAEKkH,IAAYpH,QAAeC,EAAQC,EAAQ,SAAS,CAAC,GACrDqC,IAAgB4E,EAAa,eAC7B1E,KAAsB,MAAa0E,EAAa,mBAAmB3G,CAAK,GAExE6G,IAAOrH,QACTsH,EAAgB;EACZ,MAAM5F,EAAK;EACX,QAAQa,EAAc;EACtB,cAAcgE,EAAa;EAC3B,YAAYtG,EAAQC,EAAQ,UAAU,KAAK;EAC3C,UAAUD,EAAQC,EAAQ,QAAQ;EAClC,OAAO2G,EAAM;CACjB,CAAC,CACL,GAEMU,IAAevH,QACjBwH,EAAmB;EACf,GAAGxD,EAAM;EACT,WAAW/D,EAAQC,EAAQ,SAAS,KAAK,CAAC;EAC1C,QAAQqC,EAAc;EACtB,gBAAgBE;EAChB,YAAYxC,EAAQC,EAAQ,UAAU,KAAK;EAC3C,OAAO2G,EAAM;CACjB,CAAC,CACL,GAEMY,IAAWzH,QACb0H,EAAe;EACX,GAAG1D,EAAM;EACT,QAAQzB,EAAc;EACtB,gBAAgBtC,EAAQC,EAAQ,cAAc,KAAK;EACnD,gBAAgBD,EAAQC,EAAQ,cAAc,KAAK;EACnD,OAAO2G,EAAM;CACjB,CAAC,CACL,GAGMc,IAAW3H,QACb4H,EAAe;EACX,GAAG5D,EAAM;EACT,QAAQzB,EAAc;EACtB,WAAW6E,EAAU;EACrB,gBAAgB3E;EAChB,YAAYxC,EAAQC,EAAQ,UAAU,KAAK;EAC3C,gBAAgBD,EAAQC,EAAQ,cAAc,KAAK;EACnD,gBAAgBD,EAAQC,EAAQ,cAAc,KAAK;EACnD,aAAaD,EAAQC,EAAQ,WAAW,KAAK;EAC7C,OAAO2G,EAAM;CACjB,CAAC,CACL,GAGMgB,IAAQ7H,QACV8H,EAAY;EACR,QAAQvF,EAAc;EACtB,aAAayE,EAAO;EACpB,OAAO/G,EAAQC,EAAQ,UAAU,KAAK;EACtC,cAAcqG,EAAa;EAC3B,OAAOM,EAAM;EACb,OAAO5G,EAAQC,EAAQ,UAAU,KAAK,CAAC;CAC3C,CAAC,CACL,GAGM6H,IAAajI,EAAI,CAAC,GAElBkI,IAAQhI,QACViI,GAAYvG,EAAK,OAAO4E,EAAK,OAAOC,EAAa,OAAOG,EAAO,KAAK,CACxE,GAEMwB,IAAelI,SAAgB;EAAE,OAAOqH,EAAK,MAAM;EAAO,KAAKA,EAAK,MAAM;CAAI,EAAE;CAEtF,SAASc,EAAQ,GAA2B;EAExC,AADA,EAAK,QAAQzH,GACb,EAAY,QAAQA;CACxB;CAGA,SAAS0H,EAAU,GAA2B;EAG1C,AAFA,EAAY,QAAQ1H,GAEf2H,EAAa3H,GAAOgB,EAAK,OAAO4E,EAAK,OAAOC,EAAa,KAAK,MAC/D,EAAK,QAAQ7F;CAErB;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAYyH,EAAQG,EAAS5G,EAAK,OAAO4E,EAAK,OAAO,EAAE,CAAC;EACxD,YAAY6B,EAAQG,EAAS5G,EAAK,OAAO4E,EAAK,OAAO,CAAC,CAAC;EACvD,iBAAiB6B,EAAQtB,EAAM,KAAK;EACpC,GAAGM;CACP;AACJ;AAIA,IAAMoB,IAAkD,OAAO,iBAAiB;AAGhF,SAAgBC,EACZ,GACF;CACE,EAAQD,GAAkBE,CAAqC;AACnE;AAEA,SAAgBC,EAAsB,GAAoC;CACtE,IAAMD,IAAUE,EAAOJ,GAAkB,IAAI;CAE7C,IAAI,CAACE,GACD,MAAU,MAAM,IAAIG,EAAU,sCAAsC;CAGxE,OAAOH;AACX;;;;;;;;;EC1PA,IAAM,EAAE,aAAUC,EAAsB,iBAAiB;E,kBAIrDrX,EAAA,GAAAC,EAMYC,EAAA2X,CAAA,GAAA;GALP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,aAAU;;GAEV,SAAA3X,QAAuC,CAAvCC,EAAuC6X,EAAA,QAAA,WAAA,EAAhC,OAAO/X,EAAAyW,CAAA,EAAK,SAAoB,CAAftW,EAAAC,EAAAJ,EAAAyW,CAAA,CAAK,GAAA,CAAA,C;;;;;;;;;;;;EETrC,IAAM0B,IAAQP,GAIRQ,IAAWjB,EAAsB,aAAa,GAE9CkB,IAAa5J,QAEX0J,EAAM,WAAW,WACjBrB,EACIsB,EAAS,KAAK,OACdA,EAAS,MAAM,OACfA,EAAS,KAAK,OACdA,EAAS,aAAa,KAC1B,CACR;EAEA,SAASE,IAAM;GACX,AAAIH,EAAM,WAAW,SACjBC,EAAS,KAAK,IACPD,EAAM,WAAW,SACxBC,EAAS,KAAK,IAEdA,EAAS,UAAU;EAE3B;E,kBAII9X,EAAA,GAAAC,EASYC,EAAAmX,CAAA,GAAA;GARP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,MAAMA,EAAA,OAAE,WAAA,WAA2B,KAAA;GACnC,eAAaA,EAAA;GACb,gBAAcS,EAAA,QAAU,KAAQ,KAAA;GAChC,SAAOC;;GAER,SAAA7X,QAAQ,CAARC,EAAQqX,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EE5BhB,IAAMI,IAAQP,GA6BRe,IAAOD,GAMPvI,IAAOvP,EAA+BgX,GAAC,MAE5C,GAEKQ,IAAWtD,EAAe;GAC5B;GACA,cAAcqD,EAAM;GACpB,YAAYA,EAAM;GAClB,oBAAoBA,EAAM;GAC1B,gBAAgBA,EAAM;GACtB,cAAcA,EAAM;GACpB,kBAAkBA,EAAM;GACxB,gBAAgBA,EAAM;GACtB,aAAaA,EAAM;GACnB,iBAAiBA,EAAM;GACvB,iBAAiB,MAAUA,EAAM,iBAAiBlJ,CAAK;GACvD,kBAAkBkJ,EAAM;GACxB,sBAAsBA,EAAM;GAC5B,sBAAsBA,EAAM;GAC5B,mBAAmBA,EAAM;GACzB,kBAAkBA,EAAM;GACxB,kBAAkBA,EAAM;GACxB,gBAAgBA,EAAM;GACtB,kBAAkBA,EAAM;GACxB,mBAAmBA,EAAM;GACzB,UAAU,MAAUA,EAAM,UAAUlJ,CAAK,KAAK;GAC9C,cAAc,MAAW0J,EAAK,cAAclH,CAAM;GAClD,gBAAgB,MAAWkH,EAAK,gBAAgBlH,CAAM;GACtD,gBAAgB,MAAWkH,EAAK,gBAAgBlH,CAAM;EAC1D,CAAC;EAcD,AAZAoH,EAAM1I,IAAO,MAAU;GACnB,IAAM,EAAE,UAAO,WAAQiI,EAAS,MAAM,OAChCU,IAAUV,EAAS,YAAY;GAErC,CACI,SAAS,UAAU,QAAQU,GAASC,CAAK,IAAI,KAC7C,SAAS,UAAU,QAAQD,GAASE,CAAG,IAAI,OAE3C,EAAS,YAAY,QAAQ7J;EAErC,CAAC,GAED8H,EAAuBmB,CAAQ;EAG/B,IAAMa,IAAiB;GACnB,UAAU;GACV,OAAO;GACP,QAAQ;GACR,UAAU;GACV,MAAM;GACN,YAAY;EAChB;E,kBAIIpY,EAAA,GAAAC,EAqBYC,EAAA4W,CAAA,GAAA;GApBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,aAAW7W,EAAAqX,CAAA,CAAQ,CAAC,KAAK;;GAE1B,SAAApX,QAQE,CARFC,EAQE8W,EAAA,QAAA,WAAA;IAPG,MAAMhX,EAAAqX,CAAA,CAAQ,CAAC,KAAK;IACpB,MAAMjI,EAAA;IACN,OAAOpP,EAAAqX,CAAA,CAAQ,CAAC,MAAM;IACtB,cAAerX,EAAAqX,CAAA,CAAQ,CAAC,aAAa;IACrC,MAAMrX,EAAAqX,CAAA,CAAQ,CAAC;IACf,MAAMrX,EAAAqX,CAAA,CAAQ,CAAC;IACf,WAAarX,EAAAqX,CAAA,CAAQ,CAAC;G,IAGhBR,EAAA,U,aADX/W,EAAA,GAAAK,EAMM,OAAA;;IAJF,aAAU;IACT,OAAO+X;GAEL,GAAA9X,EAAAJ,EAAAqX,CAAA,CAAQ,CAAC,aAAa,KAAK,GAAA,CAAA,E;;;;;;;;;;;;;;;;EExH1C,IAAMD,IAAQP,GAIRQ,IAAWjB,EAAsB,UAAU,GAE3CkC,IAAa5K,QAAe;GAC9B,IAAMgE,IAAQ2F,EAAS,cAAc;GAErC,OACI3F,GAAO,SAAS,SAChB,SAAS,UAAU,QAAQ0F,EAAM,IAAI,MAAM1F,EAAM,SAAS,KAAK,KAC/D,SAAS,UAAU,QAAQ0F,EAAM,IAAI,MAAM1F,EAAM,OAAO,KAAK;EAErE,CAAC,GAEK6G,IAAY7K,QAAe0J,EAAM,IAAI,KAAK,OAAOC,EAAS,YAAY,KAAK,CAAC,GAE5EmB,IAAQ9K,QAAe;GACzB,IAAM0B,IAAOgI,EAAM,IAAI,KAAK,eAAeC,EAAS,OAAO,OAAO,EAAE,WAAW,OAAO,CAAC,GACjFoB,IAAQrB,EAAM,IAAI;GAExB,OAAOqB,IAAQ,GAAGrJ,EAAK,IAAIqJ,EAAM,GAAGA,MAAU,IAAI,UAAU,aAAarJ;EAC7E,CAAC;E,kBAIG7O,EAAA,GAAAC,EAuBYC,EAAAmW,CAAA,GAAA;GAtBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,UAAU0B,EAAA,QAAS,IAAA;GACnB,cAAYC,EAAA;GACZ,gBAAc3B,EAAA,IAAI,UAAO,SAAY,KAAA;GACrC,aAAWA,EAAA,IAAI,KAAK,SAAQ;GAC5B,cAAYA,EAAA,IAAI,UAAO,KAAQ,KAAA;GAC/B,gBAAcA,EAAA,IAAI,YAAS,KAAQ,KAAA;GACnC,gBAAcA,EAAA,IAAI,YAAS,KAAQ,KAAA;GACnC,gBAAc0B,EAAA,QAAS,KAAQ,KAAA;GAC/B,iBAAe1B,EAAA,IAAI,cAAW,KAAQ,KAAA;GACtC,iBAAeyB,EAAA,QAAU,KAAQ,KAAA;GAClC,aAAU;GACT,SAAK,AAAAI,EAAA,QAAA,MAAE,EAAArB,CAAA,CAAQ,CAAC,YAAY,QAAQR,EAAA,IAAI;;GAEzC,SAAAnW,QAKE,CALFC,EAKEqW,EAAA,QAAA,WAAA;IAJG,KAAKH,EAAA;IACL,UAAUA,EAAA,IAAI;IACd,kBAAmBA,EAAA,IAAI;IACvB,aAAcA,EAAA,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;EE/C/B,IAAMO,IAAQP,GAIR,EAAE,cAAWT,EAAsB,cAAc,GAEjDoC,IAAQ9K,QAAe;GACzB,IAAM0B,IAAOgI,EAAM,IAAI,KAAK,eAAehD,EAAO,OAAO;IAAE,OAAO;IAAQ,KAAK;GAAU,CAAC;GAE1F,OAAO,YAAYgD,EAAM,IAAI,WAAW,aAAahI;EACzD,CAAC;E,iBAKayH,EAAA,IAAI,eADdhW,EAAA,GAAAC,EAYYC,EAAA6V,CAAA,GAAA;;GAVP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,MAAMA,EAAA,OAAE,WAAA,WAA2B,KAAA;GACnC,cAAY2B,EAAA;;GAEb,SAAAxX,QAIC,CAJDC,EAIC+V,EAAA,QAAA,WAAA;IAHI,aAAcH,EAAA,IAAI;IAClB,YAAaA,EAAA,IAAI;GAFtB,SAIC,CADI3V,EAAA,MAACC,EAAG0V,EAAA,IAAI,WAAW,IAAG,SAAK,CAAA,C;;;;;;;;;A,IEtBlC+B,IAAqD,OAAO,wBAAwB;AAO1F,SAAgBC,EACZ,GACA,GACA,GAIF;CACE,IAAMxB,IAAWjB,EAAsBE,CAAS,GAC1C,EAAE,QAAK,UAAO,0BAAuBe;CAE3C,EAAQuB,GAAe,EAAE,aAAajL,EAAQO,CAAK,EAAE,CAAC;CAEtD,IAAM4K,IAAgBpL,QAAe+G,EAAmB,UAAU9G,EAAQO,CAAK,CAAC,CAAC,EAAE,GAC7E6K,IAAarL,QAAe2J,EAAS,QAAQ1J,EAAQO,CAAK,CAAC,CAAC,GAC5DqC,IAAa7C,QAAe2J,EAAS,WAAW1J,EAAQO,CAAK,CAAC,CAAC,GAE/D8K,IAAStL,QAAe;EAC1B,IAAM,EAAE,WAAQ,QAAK,eAAYC,EAAQO,CAAK;EAE9C,OAAO+K,IACD,SAAS,UAAU,QAAQlH,GAASwC,EAAM,KAAK,IAAI,IACnD,SAAS,cAAc,QAAQ0D,GAA+B5D,EAAI,KAAK,IAAI;CACrF,CAAC;CAED,SAAS6E,IAAY;EACjB,EAAmB,QAAQvL,EAAQO,CAAK,CAAC,CAAC;CAC9C;CAEA,SAASiL,IAAc;EACnB,AAAIL,EAAc,UACd,EAAmB,QAAQ;CAEnC;CAEA,SAASM,EAAc,GAA4B;EAC/C,EAAS,iBAAiBtI,GAAcnD,EAAQO,CAAK,GAAG,MAAM;CAClE;CAEA,SAASmL,EAAU,GAA8B;EAC7C,EAAS,mBACLhG,GACA1F,EAAQO,CAAK,GACbP,EAAQ2L,EAAY,IAAI,GACxB3L,EAAQ2L,EAAY,UAAU,CAClC;CACJ;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,SAAgBC,EAAqB,GAA0C;CAC3E,IAAMpD,IAAUE,EAAOuC,GAAe,IAAI;CAE1C,IAAI,CAACzC,GACD,MAAU,MAAM,IAAIG,EAAU,0CAA0C;CAG5E,OAAOH;AACX;;;;;;;;;;;;;;;EC1EA,IAAMiB,IAAQP,GAiBR,EACF,kBACA,WACA,eACA,eACA,cACA,gBACA,kBACA,iBACAgC,EAAc,kBAAkBzB,EAAM,QAAQ,OAAO;GACrD,YAAYA,EAAM;GAClB,kBAAkBA,EAAM;EAC5B,CAAC;E,kBAIG9V,EAAA,GAAAC,EA2BYC,EAAAoV,CAAA,GAAA;GA1BP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,OAAKpV,EAAA;IAAkC,kBAAAoV,EAAA,QAAQ;IAAoC,gBAAAA,EAAA,QAAQ;IAAkC,gBAAAA,EAAA,QAAQ;;GAKrI,iBAAeA,EAAA,QAAQ,MAAM;GAC7B,gBAAcA,EAAA,QAAQ,MAAM,SAAM,KAAQ,KAAA;GAC1C,yBAAuBA,EAAA,QAAQ,kBAAe,KAAQ,KAAA;GACtD,wBAAsBA,EAAA,QAAQ,iBAAc,KAAQ,KAAA;GACpD,aAAWrV,EAAAwX,CAAA,IAAM,KAAQ,KAAA;GACzB,oBAAkBxX,EAAAsX,CAAA,IAAa,KAAQ,KAAA;GACvC,iBAAetX,EAAAuX,CAAA,IAAU,KAAQ,KAAA;GACjC,iBAAevX,EAAA+O,CAAA,IAAU,KAAQ,KAAA;GACjC,gBAAc/O,EAAA0X,CAAA;GACd,gBAAc1X,EAAA2X,CAAA;GACd,WAAS3X,EAAA0X,CAAA;GACT,YAAU1X,EAAA2X,CAAA;GACV,eAAa3X,EAAA4X,CAAA;GACb,WAAS5X,EAAA6X,CAAA;;GAEV,SAAA3X,QAGE,CAHFC,EAGEqV,EAAA,QAAA,WAAA;IAFG,OAAOH,EAAA,QAAQ;IACf,SAASA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEzDtB,IAAMQ,IAAWjB,EAAsB,mBAAmB,GACpD,EAAE,aAAUmD,EAAqB,mBAAmB;E,iBAK5C1X,EAAAwV,CAAA,CAAQ,CAAC,QAAQxV,EAAAqM,CAAA,CAAK,CAAA,CAAA,KADhCpM,EAAA,GAAAC,EAiBYF,EAAA+U,CAAA,GAAA;;GAfP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACZ,yBAAA;GACC,aAAWA,EAAA;GACX,eAAW,AAAA6B,EAAA,QAAA,MAAe7W,EAAAwV,CAAA,CAAQ,CAAC,iBAAkCsC,GAAwB9X,EAAAqM,CAAA,CAAK,CAAA,GAAoB2I,EAAA,SAAI,UAAA,iBAAA,Y;GAO1H,SAAK,AAAA6B,EAAA,OAAA1W,QAAN,CAAA,GAAmB,CAAA,WAAA,MAAA,CAAA;;GAEnB,SAAAC,QAAQ,CAARC,EAAQ8U,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;EEzBhB,IAAMK,IAAWjB,EAAsB,OAAO;E,kBAI1C/T,EAAA,GAAAC,EAcYC,EAAAqU,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYtU,EAAA8U,CAAA,CAAQ,CAAC,MAAM,MAAM;GACjC,OAAK7U,EAAA,EAAA,eAAmBD,EAAA8U,CAAA,CAAQ,CAAC,MAAM,MAAM,SAAQ,CAAA;GACrD,eAAa9U,EAAA8U,CAAA,CAAQ,CAAC;;GAEvB,SAAA5U,QAKE,CALFC,EAKEsU,EAAA,QAAA,WAAA;IAJG,OAAOzU,EAAA8U,CAAA,CAAQ,CAAC,MAAM;IACtB,MAAM9U,EAAA8U,CAAA,CAAQ,CAAC,MAAM,MAAM;IAC3B,SAAS9U,EAAA8U,CAAA,CAAQ,CAAC,MAAM,MAAM;IAC9B,QAAQ9U,EAAA8U,CAAA,CAAQ,CAAC,MAAM,MAAM;;;;;;;;;;;;;;;;;;;EEjB1C,IAAMD,IAAQP,GAER,EACF,kBACA,WACA,eACA,eACA,cACA,gBACA,kBACA,iBACAgC,EAAc,kBAAkBzB,EAAM,IAAI,OAAO,EACjD,MAAM;GAAE,YAAY;GAAO,UAAU;EAAO,EAChD,CAAC;E,kBAIGxU,EAAA,GAAAC,EAsBYC,EAAA8T,CAAA,GAAA;GArBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,OAAK9T,EAAA;IAAA,eAAmB8T,EAAA,IAAI;IAAW,aAAeA,EAAA,IAAI;GAAS,CAAA;GACnE,iBAAeA,EAAA,IAAI,MAAM;GACzB,yBAAuBA,EAAA,IAAI,kBAAe,KAAQ,KAAA;GAClD,wBAAsBA,EAAA,IAAI,iBAAc,KAAQ,KAAA;GAChD,aAAW/T,EAAAkW,CAAA,IAAM,KAAQ,KAAA;GACzB,oBAAkBlW,EAAAgW,CAAA,IAAa,KAAQ,KAAA;GACvC,iBAAehW,EAAAiW,CAAA,IAAU,KAAQ,KAAA;GACjC,iBAAejW,EAAAyN,CAAA,IAAU,KAAQ,KAAA;GACjC,gBAAczN,EAAAoW,CAAA;GACd,gBAAcpW,EAAAqW,CAAA;GACd,WAASrW,EAAAoW,CAAA;GACT,YAAUpW,EAAAqW,CAAA;GACV,eAAarW,EAAAsW,CAAA;GACb,WAAStW,EAAAuW,CAAA;;GAEV,SAAArW,QAGE,CAHFC,EAGE+T,EAAA,QAAA,WAAA;IAFG,OAAOH,EAAA,IAAI;IACX,KAAKA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEjClB,IAAMO,IAAQP,GAURQ,IAAWjB,EAAsB,YAAY,GAE7C4D,IAAMxM,EAA0B,IAAI,GAQpCyM,IAAW5M,EAA2B,CAAC,CAAC,GAExC6M,KAAQ,GAAoB,GAAmB,MACjDC,EAAU,cAAc,IAAIC,EAAU,IAAI,IAAI,OAAO,OAAO9J,CAAE,CAAC,EAAE,GAAG;EAExE,SAAS+J,IAAU;GACf,IAAMF,IAAYH,EAAI,OAAO;GAE7B,IAAI,CAACA,EAAI,SAAS,CAACG,GACf;GAGJ,IAAM3K,IAASwK,EAAI,MAAM,sBAAsB;GAE/C,EAAS,QAAQ3C,EAAS,MAAM,MAAM,MAAM,SAAS,MAAS;IAC1D,IAAMiD,IAAUJ,EAAKC,GAAW,iBAAiBI,EAAK,KAAK,MAAM,EAAE,GAC7DC,IAAQN,EAAKC,GAAW,iBAAiBI,EAAK,GAAG,MAAM,EAAE,GACzDE,IAAUP,EAAKC,GAAW,qBAAqBI,EAAK,KAAK,MAAM,EAAE;IAEvE,IAAI,CAACD,KAAW,CAACE,KAAS,CAACC,GACvB,OAAO,CAAC;IAGZ,IAAMC,IAAWJ,EAAQ,sBAAsB,GACzCK,IAASH,EAAM,sBAAsB,GACrCI,IAAUH,EAAQ,sBAAsB,GACxCI,IAAO;KACT,GAAGH,EAAS,QAAQlL,EAAO;KAC3B,GAAGkL,EAAS,MAAMA,EAAS,SAAS,IAAIlL,EAAO;IACnD,GACMsL,IAAK;KACP,GAAGH,EAAO,OAAOnL,EAAO;KACxB,GAAGmL,EAAO,MAAMA,EAAO,SAAS,IAAInL,EAAO;IAC/C,GACMuL,KAAWD,EAAG,IAAID,EAAK,IAAID,EAAQ,SAASA,EAAQ,OAAOpL,EAAO;IAExE,OAAO,CACH;KACI;KACA,MAAMwL,GACFC,GAAeJ,GAAMC,GAAI;MAAE,KAAK1D,EAAM;MAAK;KAAQ,CAAC,GACpDA,EAAM,MACV;KACA,OAAO8D,EAAeJ,GAAI1D,EAAM,SAAS;IAC7C,CACJ;GACJ,CAAC;EACL;EAEA,IAAI+D,IAAQ,GAENC,UAAwB;GAE1B,AADA,qBAAqBD,CAAK,GAC1B,IAAQ,sBAAsBd,CAAO;EACzC,GAEIgB;EAiBJ,AAfAC,QAAgB;GAOZ,AANA,IAAW,IAAI,eAAeF,CAAe,GAEzCpB,EAAI,OAAO,iBACXqB,EAAS,QAAQrB,EAAI,MAAM,aAAa,GAG5ClH,EAASsI,CAAe;EAC5B,CAAC,GAEDG,QAAsB;GAElB,AADA,qBAAqBJ,CAAK,GAC1BE,GAAU,WAAW;EACzB,CAAC,GAEDvD,EAAMT,EAAS,aAAavE,EAASsI,CAAe,CAAC;EAGrD,IAAMI,IAAQ9N,QAAe;GACzB,IAAM+N,IAAcpE,EAAS,mBAAmB;GAEhD,OAAO4C,EAAS,MAAM,KAAK,MAAS;IAChC,IAAMyB,IACFD,MAAgB,SACfE,EAAK,KAAK,KAAK,MAAM,OAAOF,KAAeE,EAAK,KAAK,GAAG,MAAM,OAAOF;IAE1E,OAAO;KAAE,GAAGE;KAAM,aAAaD;KAAS,QAAQD,MAAgB,QAAQ,CAACC;IAAQ;GACrF,CAAC;EACL,CAAC;E,kBAIGvY,EAAA,GAAAC,EAKM,OAAA;GAJE,SAAA;GAAJ,KAAI4W;GACJ,eAAY;E,IAEZ3W,EAAuB2T,EAAA,QAAA,WAAA,EAAhB,OAAOwE,EAAA,MAAK,CAAA,C;;;;;;;;;;E,kBEpHvBjY,EAAA,GAAAC,EAUYC,EAAAmT,CAAA,GAAA;GATP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,qBAAmBA,EAAA,IAAI,MAAM;;GAE9B,SAAAnT,QAGE,CAHFC,EAGEqT,EAAA,QAAA,WAAA;IAFG,KAAKH,EAAA;IACL,OAAOA,EAAA,IAAI;;;;;;;;;;;;;;;;EETxB,IAAM,EAAE,aAAUT,EAAsB,YAAY;E,iBAKtCvS,EAAA0R,CAAA,CAAK,CAAC,gBAAW,O,aAD3BzR,EAAA,GAAAC,EAQYF,EAAA+S,CAAA,GAAA;;GANP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACX,OAAK7S,EAAA,EAAA,WAAeH,EAAA0R,CAAA,CAAK,CAAC,YAAW,CAAA;;GAEtC,SAAAtR,QAAQ,CAARC,EAAQ8S,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;EEXhB,IAAM,EAAE,aAAUZ,EAAsB,YAAY;E,kBAIhD/R,EAAA,GAAAC,EAQYC,EAAAqS,CAAA,GAAA;GAPP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,aAAU;GACT,mBAAiBtS,EAAAgR,CAAA,CAAK,CAAC,MAAM,SAAQ;GACrC,kBAAgBhR,EAAAgR,CAAA,CAAK,CAAC;;GAEvB,SAAA/Q,QAAQ,CAARC,EAAQuS,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;;EEVhB,IAAMK,IAAWjB,EAAsB,WAAW;EAElD,SAAS4F,EAAU,GAAsB,GAAqD;GAC1F,IAAM/H,IAAeoD,EAAS,KAAK,MAAM,SAAS,EAAE,CAAC;GAErD,QAAQnJ,EAAM,KAAd;IACI,KAAK,aACD,OAAO2M,EAAK,SAAS,EAAE,MAAM,EAAE,CAAC;IACpC,KAAK,cACD,OAAOA,EAAK,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,KAAK,WACD,OAAOA,EAAK,SAAS,EAAE,OAAO,EAAE,CAAC;IACrC,KAAK,aACD,OAAOA,EAAK,IAAI,EAAE,OAAO,EAAE,CAAC;IAChC,KAAK,QACD,OAAOoB,EAAYpB,GAAM5G,CAAY;IACzC,KAAK,OACD,OAAOgI,EAAYpB,GAAM5G,CAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1D,KAAK,UACD,OAAO4G,EAAK,SAAS3M,EAAM,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtE,KAAK,YACD,OAAO2M,EAAK,IAAI3M,EAAM,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjE,SACI,OAAO;GACf;EACJ;EAGA,eAAemL,EAAU,GAAsB;GAC3C,IAAMtE,IAAO7G,EAAM;GAGnB,KAFaA,EAAM,kBAAkB,cAAcA,EAAM,SAAS,KAAA,EAExD,aAAa,MAAM,MAAM,YAC/B;GAGJ,IAAMuB,IAASuM,EAAU9N,GAAOmJ,EAAS,YAAY,KAAK;GAE1D,AAAK5H,MAILvB,EAAM,eAAe,GACrBmJ,EAAS,UAAU5H,CAAM,GAEzB,MAAMqD,EAAS,GACfiC,EAAK,cAA2B,eAAetF,EAAO,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM;EACjF;E,kBAII9K,EAAA,GAAAC,EAaYC,EAAA+R,CAAA,GAAA;GAZP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYhS,EAAAwS,CAAA,CAAQ,CAAC,MAAM;GAClB;GACT,eAAaxS,EAAAwS,CAAA,CAAQ,CAAC;;GAEvB,SAAAvS,QAIE,CAJFC,EAIEiS,EAAA,QAAA,WAAA;IAHG,MAAMnS,EAAAwS,CAAA,CAAQ,CAAC,KAAK;IACpB,UAAUxS,EAAAwS,CAAA,CAAQ,CAAC,KAAK,MAAM;IAC9B,OAAOxS,EAAAwS,CAAA,CAAQ,CAAC,KAAK,MAAM;;;;;;;;;;;;;;;;;;E,kBE9DpCpS,EAAA,GAAAC,EAcYC,EAAAyR,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,OAAKzR,EAAA;IAAgC,gBAAAyR,EAAA,KAAK,mBAAoB,KAAA,KAAK;IAA0D,wBAAAA,EAAA,KAAK;;GAIlI,iBAAeA,EAAA,KAAK,cAAW,KAAQ,KAAA;;GAExC,SAAAxR,QAGE,CAHFC,EAGE0R,EAAA,QAAA,WAAA;IAFG,MAAMH,EAAA;IACN,MAAMA,EAAA,KAAK;;;;;;;;;;;;;;;;;;EEfxB,IAAMO,IAAQP,GAIR,EAAE,cAAWT,EAAsB,cAAc,GAEjDoC,IAAQ9K,QAAe0J,EAAM,KAAK,eAAehD,EAAO,OAAO,EAAE,SAAS,QAAQ,CAAC,CAAC,GACpFgI,IAAY1O,QAAe0J,EAAM,KAAK,eAAehD,EAAO,OAAO,EAAE,SAAS,OAAO,CAAC,CAAC;E,kBAIzF5O,EAAA,GAAAC,EAYYC,EAAAkR,CAAA,GAAA;GAXP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYuF,EAAA;GACZ,gBAAcvF,EAAA,KAAK,aAAS,IAAA,KAAa,KAAA;;GAE1C,SAAAlR,QAIC,CAJDC,EAICoR,EAAA,QAAA,WAAA;IAHI,OAAOwB,EAAA;IACP,WAAY4D,EAAA;GAFjB,SAIC,CADOvW,EAAAC,EAAA0S,EAAA,KAAK,GAAA,CAAA,C;;;;;;;;;;;;;;;;;EEnBrB,IAAMpB,IAAQP,GAIR,EAAE,QAAK,aAAU,gBAAaT,EAAsB,cAAc,GAElEkG,IAAU5O,QACN6O,EAAYlI,EAAI,MAAM,aAAaH,EAAS,KAAK,CAAC,IAAIiB,EAAS,MAAM,cAC/E,GAEMqH,IAAY9O,QACR0J,EAAM,IAAI,WAAWkF,EAAQ,SAAS,KAAKA,EAAQ,SAASnH,EAAS,MAAM,aACrF;E,iBAKcqH,EAAA,SADVxW,EAAA,GAAAC,EAQYC,EAAA0Q,CAAA,GAAA;;GANP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACX,OAAK1Q,EAAA,EAAA,SAAamW,EAAA,MAAO,CAAA;;GAE1B,SAAAlW,QAAQ,CAARC,EAAQ2Q,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;;;;;EExBhB,IAAMI,IAAQP,GAeRQ,IAAWjB,EAAsB,cAAc,GAE/CsG,IAAMhP,QAAe2J,EAAS,aAAa,MAAM,KAAKD,EAAM,KAAK,OAAO,GAExEmB,IAAY7K,QAEV0J,EAAM,aAAaC,EAAS,WAAW,SACvCD,EAAM,KAAK,KAAK,OAAOC,EAAS,YAAY,KAAK,CACzD,GAEMmB,IAAQ9K,QAAe;GACzB,IAAM0B,IAAOgI,EAAM,KAAK,KAAK,eAAeC,EAAS,OAAO,OAAO,EAAE,WAAW,OAAO,CAAC,GAClFoB,IAAQrB,EAAM,KAAK,YACnB1C,IAAS+D,IAAQ,GAAGA,EAAM,GAAGA,MAAU,IAAI,UAAU,aAAa;GAExE,OAAO;IAACrB,EAAM;IAAehI;IAAMsF;GAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;EACxE,CAAC,GAEK4D,IAAa5K,QAAe;GAC9B,IAAMgE,IAAQ2F,EAAS,cAAc;GAErC,OACI3F,GAAO,SAAS,SAChBA,EAAM,eAAe0F,EAAM,cAC3B,SAAS,UAAU,QAAQA,EAAM,KAAK,MAAM1F,EAAM,SAAS,KAAK,KAChE,SAAS,UAAU,QAAQ0F,EAAM,KAAK,MAAM1F,EAAM,OAAO,KAAK;EAEtE,CAAC;EAED,SAASiL,IAAU;GAEf,AADA,EAAS,WAAW,QAAQvF,EAAM,UAClC,EAAS,YAAY,QAAQA,EAAM,KAAK;EAC5C;E,kBAII5Q,EAAA,GAAAC,EAsBYC,EAAAkQ,CAAA,GAAA;GArBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,UAAU0B,EAAA,QAAS,IAAA;GACnB,cAAYC,EAAA;GACZ,aAAW3B,EAAA,KAAK,KAAK,SAAQ;GAC7B,YAAUA,EAAA;GACV,cAAY6F,EAAA,OAAK,UAAO,KAAQ,KAAA;GAChC,gBAAcA,EAAA,OAAK,YAAS,KAAQ,KAAA;GACpC,aAAW7F,EAAA,KAAK,aAAU,KAAQ,KAAA;GAClC,gBAAcA,EAAA,KAAK,aAAU,IAAA,KAAY,KAAA;GACzC,gBAAc0B,EAAA,QAAS,KAAQ,KAAA;GAC/B,iBAAeD,EAAA,QAAU,KAAQ,KAAA;GAClC,aAAU;GACT,oBAAkBzB,EAAA,eAAe,KAAA,IAAY,KAAA,IAAY,OAAOA,EAAA,cAAU,EAAA;GACnE;;GAER,SAAAlQ,QAGE,CAHFC,EAGEoQ,EAAA,QAAA,WAAA;IAFG,MAAMH,EAAA;IACN,UAAUA,EAAA,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;EEvE5B,IAAMO,IAAQP,GAER,EAAE,cAAWT,EAAsB,mBAAmB,GAEtDyG,IAAUnP,QAAe0J,EAAM,IAAI,KAAK,eAAehD,EAAO,OAAO,EAAE,SAAS,QAAQ,CAAC,CAAC,GAC1FoE,IAAQ9K,QAAe0J,EAAM,IAAI,KAAK,eAAehD,EAAO,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC;E,kBAI3FtN,EAAA,GAAAC,EAaYC,EAAA4P,CAAA,GAAA;GAZP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAY2B,EAAA;GACZ,cAAY3B,EAAA,IAAI,UAAO,KAAQ,KAAA;GAC/B,gBAAcA,EAAA,IAAI,YAAS,KAAQ,KAAA;;GAEpC,SAAA5P,QAIC,CAJDC,EAIC8P,EAAA,QAAA,WAAA;IAHI,KAAKH,EAAA;IACL,SAASgG,EAAA;GAFd,SAIC,CADO1V,EAAAC,EAAAyV,EAAA,KAAO,IAAG,MAACzV,EAAGyP,EAAA,IAAI,KAAK,GAAG,GAAA,CAAA,C;;;;;;;;;;;;;;;;;EEjB1C,IAAMQ,IAAWjB,EAAsB,cAAc;EAErD,SAAS4F,EACL,GACA,GACA,GACgD;GAChD,IAAMe,IAAU1F,EAAS,aAAa,MAAM,KAAK,SAAS,GACpD,EAAE,UAAO,WAAQA,EAAS,MAAM;GAEtC,QAAQnJ,EAAM,KAAd;IACI,KAAK,aACD,OAAO;KAAE,MAAMkB,EAAK,SAAS,EAAE,MAAM,EAAE,CAAC;KAAG;IAAI;IACnD,KAAK,cACD,OAAO;KAAE,MAAMA,EAAK,IAAI,EAAE,MAAM,EAAE,CAAC;KAAG;IAAI;IAC9C,KAAK,WACD,OAAO;KAAE;KAAM,KAAK,KAAK,IAAI4N,IAAM,GAAG,CAAC;IAAE;IAC7C,KAAK,aACD,OAAO;KAAE;KAAM,KAAK,KAAK,IAAIA,IAAM,GAAGD,CAAO;IAAE;IACnD,KAAK,QACD,OAAO;KAAE,MAAM7O,EAAM,UAAUkB,IAAO4I;KAAO,KAAK9J,EAAM,UAAU,IAAI8O;IAAI;IAC9E,KAAK,OACD,OAAO;KAAE,MAAM9O,EAAM,UAAUkB,IAAO6I;KAAK,KAAK/J,EAAM,UAAU6O,IAAUC;IAAI;IAClF,KAAK,UACD,OAAO;KAAE,MAAMhH,EAAS5G,GAAMiI,EAAS,KAAK,OAAO,EAAE;KAAG;IAAI;IAChE,KAAK,YACD,OAAO;KAAE,MAAMrB,EAAS5G,GAAMiI,EAAS,KAAK,OAAO,CAAC;KAAG;IAAI;IAC/D,SACI,OAAO;GACf;EACJ;EAGA,eAAegC,EAAU,GAAsB;GAC3C,IAAMtE,IAAO7G,EAAM;GAGnB,KAFaA,EAAM,kBAAkB,cAAcA,EAAM,SAAS,KAAA,EAExD,aAAa,MAAM,MAAM,YAC/B;GAGJ,IAAMuB,IAASuM,EAAU9N,GAAOmJ,EAAS,YAAY,OAAOA,EAAS,WAAW,KAAK;GAErF,AAAK5H,MAILvB,EAAM,eAAe,GACrB,EAAS,WAAW,QAAQuB,EAAO,KACnC4H,EAAS,UAAU5H,EAAO,IAAI,GAE9B,MAAMqD,EAAS,GACfiC,EAAK,cACD,cAActF,EAAO,IAAI,gBAAgBA,EAAO,KAAK,SAAS,EAAE,GACpE,CAAC,EAAE,MAAM;EACb;E,kBAIInI,EAAA,GAAAC,EAcYC,EAAAoP,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYrP,EAAA6P,CAAA,CAAQ,CAAC,MAAM;GAC3B,OAAK5P,EAAA,EAAA,eAAmBD,EAAA6P,CAAA,CAAQ,CAAC,aAAa,MAAM,KAAK,OAAM,CAAA;GACtD;GACT,eAAa7P,EAAA6P,CAAA,CAAQ,CAAC;;GAEvB,SAAA3P,QAIE,CAJFC,EAIEqP,EAAA,QAAA,WAAA;IAHG,MAAMxP,EAAA6P,CAAA,CAAQ,CAAC,aAAa;IAC5B,MAAM7P,EAAA6P,CAAA,CAAQ,CAAC,aAAa,MAAM;IAClC,MAAM7P,EAAA6P,CAAA,CAAQ,CAAC,aAAa,MAAM;;;;;;;;;;;;;;;;;;;E,kBExE3CxP,EAAA,GAAAC,EAWYC,EAAA6O,CAAA,GAAA;GAVP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;;GAEL,SAAA7O,QAKE,CALFC,EAKE+O,EAAA,QAAA,WAAA;IAJG,KAAKH,EAAA;IACL,UAAUA,EAAA,IAAI;IACd,UAAWA,EAAA,IAAI;IACf,aAAcA,EAAA,IAAI;;;;;;;;;;;;;E,kBET3B1O,EAAA,GAAAC,EAcYC,EAAAuO,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,OAAKvO,EAAA,EAAA,eAAmB,KAAK,IAAIuO,EAAA,IAAI,WAAS,CAAA,EAAA,CAAA;GAC9C,mBAAiBA,EAAA,IAAI,WAAW,KAAA,IAAS;GACzC,aAAWA,EAAA,IAAI,WAAW,KAAA,IAAS;GACnC,gBAAcA,EAAA,IAAI,cAAW,KAAQ,KAAA;;GAEtC,SAAAtO,QAIE,CAJFC,EAIEwO,EAAA,QAAA,WAAA;IAHG,KAAKH,EAAA;IACL,UAAUA,EAAA,IAAI;IACd,OAAOA,EAAA,IAAI;;;;;;;;;;;;;;;;;;;;EEdxB,IAAMO,IAAQP,GAIR,EAAE,cAAWT,EAAsB,YAAY,GAE/CoC,IAAQ9K,QAAe0J,EAAM,IAAI,KAAK,eAAehD,EAAO,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC;E,kBAI3F1L,EAAA,GAAAC,EAcYC,EAAAgO,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAY2B,EAAA;GACZ,aAAW3B,EAAA,IAAI,KAAK,SAAQ;GAC5B,cAAYA,EAAA,IAAI,UAAO,KAAQ,KAAA;GAC/B,gBAAcA,EAAA,IAAI,YAAS,KAAQ,KAAA;GACpC,aAAU;;GAEV,SAAAhO,QAGE,CAHFC,EAGEkO,EAAA,QAAA,WAAA;IAFG,KAAKH,EAAA;IACL,QAAQA,EAAA,IAAI;;;;;;;;;;;;;;;;;;;;EEnBzB,IAAMO,IAAQP,GAIR,EACF,kBACA,WACA,eACA,eACA,cACA,gBACA,kBACA,iBACAgC,EAAc,mBAAmBzB,EAAM,OAAO,OAAO,EACrD,MAAM;GAAE,YAAY;GAAO,UAAU;EAAU,EACnD,CAAC;E,kBAIGpO,EAAA,GAAAC,EA2BYC,EAAA0N,CAAA,GAAA;GA1BP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,OAAK1N,EAAA;IAAiC,iBAAA0N,EAAA,OAAO;IAAyC,eAAAA,EAAA,OAAO;IAA0C,kBAAAA,EAAA,OAAO;IAAuC,mBAAAA,EAAA,OAAO;;GAM5L,iBAAeA,EAAA,OAAO,MAAM;GAC5B,sBAAoBA,EAAA,OAAO,eAAY,KAAQ,KAAA;GAC/C,mBAAiBA,EAAA,OAAO,YAAS,KAAQ,KAAA;GACzC,aAAW3N,EAAA8P,CAAA,IAAM,KAAQ,KAAA;GACzB,oBAAkB9P,EAAA4P,CAAA,IAAa,KAAQ,KAAA;GACvC,iBAAe5P,EAAA6P,CAAA,IAAU,KAAQ,KAAA;GACjC,iBAAe7P,EAAAqH,CAAA,IAAU,KAAQ,KAAA;GACjC,gBAAcrH,EAAAgQ,CAAA;GACd,gBAAchQ,EAAAiQ,CAAA;GACd,WAASjQ,EAAAgQ,CAAA;GACT,YAAUhQ,EAAAiQ,CAAA;GACV,eAAajQ,EAAAkQ,CAAA;GACb,WAASlQ,EAAAmQ,CAAA;;GAEV,SAAAjQ,QAGE,CAHFC,EAGE2N,EAAA,QAAA,WAAA;IAFG,OAAOH,EAAA,OAAO;IACd,QAAQA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EE3CrB,IAAMQ,IAAWjB,EAAsB,UAAU;E,kBAI7C7M,EAAA,GAAAC,EAkBYC,EAAAmN,CAAA,GAAA;GAjBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYpN,EAAA4N,CAAA,CAAQ,CAAC,MAAM;GAC3B,OAAK3N,EAAA;IAA+B,eAAAD,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM,KAAK;IAAwC,oBAAA5N,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM;IAA8C,mBAAA5N,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM,OAAO;;GAK9M,eAAa5N,EAAA4N,CAAA,CAAQ,CAAC;;GAEvB,SAAA1N,QAKE,CALFC,EAKEoN,EAAA,QAAA,WAAA;IAJG,MAAMvN,EAAA4N,CAAA,CAAQ,CAAC,SAAS;IACxB,MAAM5N,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM;IAC9B,QAAS5N,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM;IACjC,OAAO5N,EAAA4N,CAAA,CAAQ,CAAC,SAAS,MAAM;;;;;;;;;;;;;;;;;;;EEpB5C,IAAMD,IAAQP,GAIR,EAAE,kBAAe,gBAAaT,EAAsB,eAAe,GAEnE1E,IAAQhE,QAAe;GACzB,IAAM6P,IAAW5L,EAAc;GAE/B,IAAI4L,GAAU,SAAS,UAAU,CAACA,EAAS,UAAU,OAAOnG,EAAM,IAAI,IAAI,GAAG,OAAO;GAEpF,IAAMoG,IAASrI,EAAS,MAAM;GAE9B,OAAO;IAAE,OAAOoI,EAAS,eAAgBC;IAAQ,KAAKD,EAAS,aAAcC;GAAO;EACxF,CAAC;E,iBAKa9L,EAAA,SADV5H,EAAA,GAAAC,EAQYC,EAAA4M,CAAA,GAAA;;GANP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACX,OAAK5M,EAAA;IAAA,qBAAyByH,EAAA,MAAM;IAAK,mBAAqBA,EAAA,MAAM;GAAG,CAAA;;GAExE,SAAAxH,QAAQ,CAARC,EAAQ6M,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;EEzBhB,IAAMK,IAAWjB,EAAsB,UAAU;E,kBAI7C9L,EAAA,GAAAC,EAmBYC,EAAAoM,CAAA,GAAA;GAlBP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYrM,EAAA6M,CAAA,CAAQ,CAAC,MAAM;GAC3B,OAAK5M,EAAA;IAAkC,kBAAAD,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;IAA6C,oBAAA7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;IAA6C,kBAAA7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;I,gBAAyD7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM,cAAc7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;;GAOhU,eAAa7M,EAAA6M,CAAA,CAAQ,CAAC;;GAEvB,SAAA3M,QAIE,CAJFC,EAIEqM,EAAA,QAAA,WAAA;IAHG,UAAUxM,EAAA6M,CAAA,CAAQ,CAAC,SAAS;IAC5B,MAAM7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;IAC9B,MAAM7M,EAAA6M,CAAA,CAAQ,CAAC,SAAS,MAAM;;;;;;;;;;;;;;;;;;;;EEvB3C,IAAMD,IAAQP,GAWRQ,IAAWjB,EAAsB,eAAe,GAShD,EACF,kBACA,WACA,eACA,eACA,cACA,gBACA,kBACA,iBACAyC,EAAc,uBAAuBzB,EAAM,KAAK,OAAO;GACvD,MAhBS1J,SAAgB;IACzB,YAAY;IACZ,UAAU;IACV,eAAe2J,EAAS,SAAS,MAAM,KAAK,KAAK,MAAQ2F,EAAI,UAAU,MAAM,IAAI;GACrF,EAYI;GACA,kBAAkB5F,EAAM;EAC5B,CAAC;E,kBAIGvM,EAAA,GAAAC,EA2BYC,EAAA6L,CAAA,GAAA;GA1BP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACV,OAAK7L,EAAA;IAAiC,iBAAA6L,EAAA,KAAK;IAAwC,eAAAA,EAAA,KAAK;IAAuC,gBAAAA,EAAA,KAAK;;GAKpI,iBAAeA,EAAA,KAAK,MAAM;GAC1B,gBAAcA,EAAA,KAAK,MAAM,SAAM,KAAQ,KAAA;GACvC,sBAAoBA,EAAA,KAAK,eAAY,KAAQ,KAAA;GAC7C,mBAAiBA,EAAA,KAAK,YAAS,KAAQ,KAAA;GACvC,aAAW9L,EAAAiO,CAAA,IAAM,KAAQ,KAAA;GACzB,oBAAkBjO,EAAA+N,CAAA,IAAa,KAAQ,KAAA;GACvC,iBAAe/N,EAAAgO,CAAA,IAAU,KAAQ,KAAA;GACjC,iBAAehO,EAAAwF,CAAA,IAAU,KAAQ,KAAA;GACjC,gBAAcxF,EAAAmO,CAAA;GACd,gBAAcnO,EAAAoO,CAAA;GACd,WAASpO,EAAAmO,CAAA;GACT,YAAUnO,EAAAoO,CAAA;GACV,eAAapO,EAAAqO,CAAA;GACb,WAASrO,EAAAsO,CAAA;;GAEV,SAAApO,QAGE,CAHFC,EAGE8L,EAAA,QAAA,WAAA;IAFG,OAAOH,EAAA,KAAK;IACZ,MAAMA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EE5DnB,IAAM,EAAE,QAAK,aAAU,gBAAaT,EAAsB,aAAa,GAEjEoH,IAAS9P,QAAe;GAC1B,IAAMkQ,IAAQvJ,EAAI,MAAM,aAAaH,EAAS,KAAK,GAC7CwI,IAAMrH,EAAS,MAAM,KAAK,MAAM,MAAcwI,EAAU,KAAK,OAAOD,EAAM,YAAY,CAAC,CAAC,GACxFtB,IAAUC,EAAYqB,CAAK,IAAIvI,EAAS,MAAM;GAMpD,OAJI,CAACqH,KAAOJ,IAAU,KAAKA,IAAUjH,EAAS,MAAM,gBACzC,OAGJqH,EAAI,SAASJ;EACxB,CAAC;E,iBAKakB,EAAA,UAAM,O,aADhBpS,EAAA,GAAAC,EAQYC,EAAAsL,CAAA,GAAA;;GANP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACX,OAAKtL,EAAA,EAAA,SAAaiS,EAAA,MAAM,CAAA;;GAEzB,SAAAhS,QAAQ,CAARC,EAAQuL,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;;E,kBExBZpL,EAAA,GAAAC,EAcYC,EAAA8K,CAAA,GAAA;GAbP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,MAAK;GACJ,cAAYA,EAAA,IAAI,WAAW,KAAA,IAAS;GACpC,OAAK9K,EAAA,EAAA,eAAmB,KAAK,IAAI8K,EAAA,IAAI,WAAS,CAAA,EAAA,CAAA;GAC9C,mBAAiBA,EAAA,IAAI,WAAW,KAAA,IAAS;GACzC,aAAWA,EAAA,IAAI,MAAM,SAAS,KAAA,IAAS;;GAExC,SAAA7K,QAIE,CAJFC,EAIE+K,EAAA,QAAA,WAAA;IAHG,KAAKH,EAAA;IACL,UAAUA,EAAA,IAAI;IACd,OAAOA,EAAA,IAAI;;;;;;;;;;;;;;;;;;;;EEVxB,IAAMO,IAAQP,GAIR,EAAE,kBAAe,aAAU,iBAAcT,EAAsB,mBAAmB,GAElF1E,IAAQhE,QAAe;GACzB,IAAM6P,IAAW5L,EAAc,OACzBqM,IAAclJ,EAAU,QAASsC,EAAM,IAAI,UAAU,MAAM,OAAQ,KAAA;GAEzE,IAAImG,GAAU,SAAS,UAAUA,EAAS,eAAeS,GAAa,OAAO;GAE7E,IAAM,EAAE,UAAO,kBAAe,sBAAmB3I,EAAS,OACpD4I,KAAU,GAA0B,MACtC1O,EAAYyI,GAAO5I,CAAI,IAAI8O,IAAgB5B,IAAU6B;GAEzD,OAAO;IACH,OAAOF,EAAOV,EAAS,WAAWA,EAAS,YAAa;IACxD,KAAKU,EAAOV,EAAS,SAASA,EAAS,UAAW;GACtD;EACJ,CAAC;E,iBAKa7L,EAAA,SADVvF,EAAA,GAAAC,EAQYC,EAAAuK,CAAA,GAAA;;GANP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,eAAY;GACX,OAAKvK,EAAA;IAAA,qBAAyBoF,EAAA,MAAM;IAAK,mBAAqBA,EAAA,MAAM;GAAG,CAAA;;GAExE,SAAAnF,QAAQ,CAARC,EAAQwK,EAAA,QAAA,SAAA,C;;;;;;;;;;;;;;;;EEnChB,IAAMI,IAAQP,GAIR,EAAE,aAAU,iBAAcT,EAAsB,eAAe;E,kBAIjEzJ,EAAA,GAAAC,EAQYC,EAAA+J,CAAA,GAAA;GAPP,IAAIC,EAAA;GACJ,YAAUA,EAAA;GACX,aAAU;GACT,qBAAmBhK,EAAAwI,CAAA,CAAQ,CAAC;GAC5B,oBAAkBxI,EAAAiI,CAAA,IAAY,OAAOsC,EAAM,IAAI,UAAU,MAAE,EAAA,IAAU,KAAA;;GAEtE,SAAAtK,QAAQ,CAARC,EAAQiK,EAAA,QAAA,SAAA,C"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_useModel","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createElementBlock","_toDisplayString","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_unref","_openBlock","_createBlock","_withModifiers","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_unref","_openBlock","_createBlock","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_sfc_main","_openBlock","_createBlock","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_sfc_main","_openBlock","_createBlock","_unref","_withCtx","_renderSlot","_sfc_main","DRAG_THRESHOLD","FOCUSABLE","NOT_SELECTION","useInteractions","drag","shallowRef","selection","announcement","ref","editable","computed","toValue","options","selectable","snap","slotMin","slotMax","canEdit","event","resourceFromAttribute","value","match","resource","resolveTarget","element","x","y","host","kind","resourceId","rect","window","axisDays","along","axisMinutes","dayIndex","date","fraction","deltaBetween","daysBetween","origin","target","snapMinutes","applyDrag","delta","state","preview","moveEvent","resizeEvent","displayEvents","withTimes","displayResourceIds","ids","others","id","isDragging","changed","commit","detail","swallowNextClick","swallow","startPointerDrag","pointerEvent","onMove","distance","move","finish","onUp","onCancel","onEscape","cancelled","key","startSelection","anchor","range","selectedRange","toZoned","current","startDate","endDate","orderedRange","step","absolute","sameDay","low","high","startAt","endAt","startMinutes","endMinutes","describe","format","times","refocus","nextTick","keyboardPreview","moved","releaseKeyboard","endKeyboardDrag","handleHeldKey","axes","keyboardEvent","direction","sign","axis","unit","resizing","next","order","index","handleEventKeydown","useCalendar","view","weekStartsOn","timeZone","localTimeZone","locale","now","ticker","today","focusedDate","highlightedEventId","events","normalizeEvents","periodRange","interactions","resources","grid","createMonthGrid","resourceGrid","createResourceGrid","timeGrid","createTimeGrid","timeline","createTimeline","gantt","createGantt","focusedRow","title","periodTitle","visibleRange","setDate","focusDate","isSamePeriod","navigate","CALENDAR_CONTEXT","provideCalendarContext","context","injectCalendarContext","inject","component","CalendarHeading_default","defineComponent","openBlock","createBlock","unref","Primitive","__props","withCtx","renderSlot","_ctx","createTextVNode","toDisplayString","CalendarNav_default","props","calendar","showsToday","run","CalendarRoot_default","\"date\"","\"dateModifiers\"","__emit","emit","useModel","watch","focused","start","end","visuallyHidden","createCommentVNode","createElementBlock","MonthDay_default","isSelected","isFocused","label","count","_cache","MonthDayMore_default","EVENT_CONTEXT","useEventState","isHighlighted","isEditable","isPast","allDay","highlight","unhighlight","onPointerdown","onKeydown","interaction","injectEventPrimitive","EventBar_default","normalizeStyle","EventResizeHandle_default","$event","withModifiers","Gantt_default","GanttBar_default","GanttLinks_default","svg","measured","find","container","attribute","measure","fromBar","link","toBar","fromRow","fromRect","toRect","rowRect","from","to","gutterY","roundedPath","routeGanttLink","ganttLinkArrow","frame","scheduleMeasure","observer","onMounted","onBeforeUnmount","links","highlighted","touches","item","GanttRow_default","GanttToday_default","GanttTrack_default","MonthGrid_default","targetFor","startOfWeek","MonthWeek_default","MonthWeekday_default","longLabel","NowIndicator_default","minutes","wallMinutes","isVisible","ResourceCell_default","day","onFocus","ResourceDayHeader_default","weekday","ResourceGrid_default","lastRow","row","ResourceLabel_default","ResourceRow_default","TimeColumn_default","TimeEvent_default","TimeGrid_default","TimeSelection_default","selected","offset","Timeline_default","TimelineEvent_default","TimelineNow_default","local","candidate","TimelineRow_default","TimelineSelection_default","rowResource","toAxis","windowMinutes","slotMinMinutes","TimelineTrack_default"],"sources":["../src/useInteractions.ts","../src/useCalendar.ts","../src/CalendarHeading.vue","../src/CalendarHeading.vue","../src/CalendarNav.vue","../src/CalendarNav.vue","../src/CalendarRoot.vue","../src/CalendarRoot.vue","../src/MonthDay.vue","../src/MonthDay.vue","../src/MonthDayMore.vue","../src/MonthDayMore.vue","../src/useEventState.ts","../src/EventBar.vue","../src/EventBar.vue","../src/EventResizeHandle.vue","../src/EventResizeHandle.vue","../src/Gantt.vue","../src/Gantt.vue","../src/GanttBar.vue","../src/GanttBar.vue","../src/GanttLinks.vue","../src/GanttLinks.vue","../src/GanttRow.vue","../src/GanttRow.vue","../src/GanttToday.vue","../src/GanttToday.vue","../src/GanttTrack.vue","../src/GanttTrack.vue","../src/MonthGrid.vue","../src/MonthGrid.vue","../src/MonthWeek.vue","../src/MonthWeek.vue","../src/MonthWeekday.vue","../src/MonthWeekday.vue","../src/NowIndicator.vue","../src/NowIndicator.vue","../src/ResourceCell.vue","../src/ResourceCell.vue","../src/ResourceDayHeader.vue","../src/ResourceDayHeader.vue","../src/ResourceGrid.vue","../src/ResourceGrid.vue","../src/ResourceLabel.vue","../src/ResourceLabel.vue","../src/ResourceRow.vue","../src/ResourceRow.vue","../src/TimeColumn.vue","../src/TimeColumn.vue","../src/TimeEvent.vue","../src/TimeEvent.vue","../src/TimeGrid.vue","../src/TimeGrid.vue","../src/TimeSelection.vue","../src/TimeSelection.vue","../src/Timeline.vue","../src/Timeline.vue","../src/TimelineEvent.vue","../src/TimelineEvent.vue","../src/TimelineNow.vue","../src/TimelineNow.vue","../src/TimelineRow.vue","../src/TimelineRow.vue","../src/TimelineSelection.vue","../src/TimelineSelection.vue","../src/TimelineTrack.vue","../src/TimelineTrack.vue"],"sourcesContent":["import {\n computed,\n nextTick,\n onScopeDispose,\n ref,\n shallowRef,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from 'vue';\nimport {\n daysBetween,\n moveEvent,\n orderedRange,\n resizeEvent,\n snapMinutes,\n withTimes,\n type CalendarEvent,\n type CalendarEventInput,\n type CalendarResource,\n type EventDelta,\n type EventTimes,\n type ResourceId,\n} from '@calends/core';\n\n/** What sits under the pointer: a day cell, a point in a day's hours, or a point on a timeline. */\nexport interface DropTarget {\n kind: 'day' | 'time' | 'axis' | 'dayaxis';\n date: Temporal.PlainDate;\n /** Wall-clock minutes from midnight, for `time` and `axis` targets. */\n minutes: number | null;\n /** Present only on targets inside a resource row; null for the unassigned row. */\n resourceId?: ResourceId | null;\n}\n\nexport interface EventDropDetail<T extends CalendarEventInput = CalendarEventInput> {\n event: T;\n start: Temporal.PlainDate | Temporal.ZonedDateTime;\n end: Temporal.PlainDate | Temporal.ZonedDateTime;\n previousStart: Temporal.PlainDate | Temporal.ZonedDateTime;\n previousEnd: Temporal.PlainDate | Temporal.ZonedDateTime;\n allDay: boolean;\n /** Set only when the event moved to another resource row (null for unassigned). */\n resourceId?: ResourceId | null;\n previousResourceId?: ResourceId | null;\n}\n\nexport interface RangeSelectDetail {\n start: Temporal.PlainDate | Temporal.ZonedDateTime;\n /** Inclusive last day for all-day ranges, exclusive end time for timed ones. */\n end: Temporal.PlainDate | Temporal.ZonedDateTime;\n allDay: boolean;\n resourceId?: ResourceId | null;\n}\n\n/** How arrow keys move a picked-up event in each layout. */\nexport interface KeyboardAxes {\n horizontal: 'day' | 'minutes';\n vertical: 'week' | 'minutes' | 'resource' | 'none';\n /** Resource ids in row order, for `vertical: 'resource'`. */\n resourceOrder?: readonly (ResourceId | null)[];\n}\n\nexport interface InteractionOptions<T extends CalendarEventInput> {\n events: ComputedRef<CalendarEvent<T>[]>;\n resources: MaybeRefOrGetter<readonly CalendarResource[] | undefined>;\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n timeZone: ComputedRef<string>;\n locale: ComputedRef<string | undefined>;\n rangeStart: ComputedRef<Temporal.PlainDate>;\n slotMinMinutes: MaybeRefOrGetter<number | undefined>;\n slotMaxMinutes: MaybeRefOrGetter<number | undefined>;\n editable?: MaybeRefOrGetter<boolean | undefined>;\n selectable?: MaybeRefOrGetter<boolean | undefined>;\n snapMinutes?: MaybeRefOrGetter<number | undefined>;\n canEdit?: (event: T) => boolean;\n onEventDrop?: (detail: EventDropDetail<T>) => void;\n onEventResize?: (detail: EventDropDetail<T>) => void;\n onRangeSelect?: (detail: RangeSelectDetail) => void;\n}\n\ntype DragKind = 'move' | 'resize-start' | 'resize-end';\n\nexport interface DragState<T extends CalendarEventInput> {\n kind: DragKind;\n event: CalendarEvent<T>;\n origin: DropTarget;\n started: boolean;\n keyboard: boolean;\n pointer: { x: number; y: number };\n preview: EventTimes;\n resourceId: ResourceId | null | undefined;\n /** Keyboard only: accumulated movement, and a separate end-edge resize from Shift. */\n moveDelta: EventDelta;\n endDelta: EventDelta;\n axes?: KeyboardAxes;\n}\n\nconst DRAG_THRESHOLD = 4;\n\nconst FOCUSABLE = 'a[href], button, [tabindex]:not([tabindex=\"-1\"])';\n\n/** A press on any of these inside a day is meant for it, not the start of a range selection. */\nconst NOT_SELECTION =\n '[data-event-id], [data-calendar-control], a[href], button, input, select, textarea';\n\nexport function useInteractions<T extends CalendarEventInput>(options: InteractionOptions<T>) {\n const drag = shallowRef<DragState<T> | null>(null);\n const selection = shallowRef<{ anchor: DropTarget; current: DropTarget } | null>(null);\n const announcement = ref('');\n\n const editable = computed(() => toValue(options.editable) ?? false);\n const selectable = computed(() => toValue(options.selectable) ?? false);\n const snap = computed(() => toValue(options.snapMinutes) ?? 15);\n const slotMin = computed(() => toValue(options.slotMinMinutes) ?? 0);\n const slotMax = computed(() => toValue(options.slotMaxMinutes) ?? 24 * 60);\n\n function canEdit(event: CalendarEvent<T>): boolean {\n return editable.value && (options.canEdit?.(event.source) ?? true);\n }\n\n function resourceFromAttribute(value: string | undefined): ResourceId | null | undefined {\n if (value === undefined) return undefined;\n if (value === '') return null;\n\n const match = (toValue(options.resources) ?? []).find(\n (resource) => String(resource.id) === value,\n );\n\n return match ? match.id : value;\n }\n\n /** Finds the drop target under a point, from the data attributes the primitives render. */\n function resolveTarget(x: number, y: number): DropTarget | null {\n for (const element of document.elementsFromPoint(x, y)) {\n // A bar's DOM parent is its start-day cell, not the day under the pointer, so look past events.\n if ((element as HTMLElement).closest('[data-event-id]')) continue;\n\n const host = (element as HTMLElement).closest<HTMLElement>('[data-drop]');\n\n if (!host) continue;\n\n const kind = host.dataset.drop as DropTarget['kind'];\n const resourceId = resourceFromAttribute(host.dataset.resourceId);\n const rect = host.getBoundingClientRect();\n const window = slotMax.value - slotMin.value;\n\n // A Gantt track: days across, its first day and length on the element itself.\n if (kind === 'dayaxis') {\n const axisDays = Number(host.dataset.axisDays);\n const along = Math.min(Math.max((x - rect.left) / rect.width, 0), 0.9999);\n\n return {\n kind,\n date: Temporal.PlainDate.from(host.dataset.axisStart!).add({\n days: Math.floor(along * axisDays),\n }),\n minutes: null,\n resourceId,\n };\n }\n\n if (kind === 'axis') {\n const axisMinutes = Number(host.dataset.axisMinutes);\n const along =\n Math.min(Math.max((x - rect.left) / rect.width, 0), 0.9999) * axisMinutes;\n const dayIndex = Math.floor(along / window);\n\n return {\n kind,\n date: options.rangeStart.value.add({ days: dayIndex }),\n minutes: slotMin.value + (along - dayIndex * window),\n resourceId,\n };\n }\n\n const date = Temporal.PlainDate.from(host.dataset.date!);\n\n if (kind === 'time') {\n const fraction = Math.min(Math.max((y - rect.top) / rect.height, 0), 1);\n\n return { kind, date, minutes: slotMin.value + fraction * window, resourceId };\n }\n\n return { kind, date, minutes: null, resourceId };\n }\n\n return null;\n }\n\n function deltaBetween(origin: DropTarget, target: DropTarget): EventDelta {\n const days = daysBetween(origin.date, target.date);\n const minutes =\n origin.minutes !== null && target.minutes !== null\n ? snapMinutes(target.minutes - origin.minutes, snap.value)\n : 0;\n\n return { days, minutes };\n }\n\n function applyDrag(state: DragState<T>, target: DropTarget) {\n const delta = deltaBetween(state.origin, target);\n const preview =\n state.kind === 'move'\n ? moveEvent(state.event, delta)\n : resizeEvent(\n state.event,\n state.kind === 'resize-start' ? 'start' : 'end',\n delta,\n snap.value,\n );\n const resourceId =\n state.kind === 'move' &&\n target.resourceId !== undefined &&\n state.origin.resourceId !== undefined\n ? target.resourceId\n : state.origin.resourceId;\n\n drag.value = { ...state, started: true, preview, resourceId };\n }\n\n /** The events with the dragged one at its preview position, for every layout to render. */\n const displayEvents = computed(() => {\n const state = drag.value;\n\n if (!state?.started) return options.events.value;\n\n return options.events.value.map((event) =>\n event.id === state.event.id ? withTimes(event, state.preview) : event,\n );\n });\n\n /** Resource ids with the dragged event moved to its preview row. */\n function displayResourceIds(event: T): readonly ResourceId[] | null | undefined {\n const ids = options.getResourceIds?.(event);\n const state = drag.value;\n\n if (\n !state?.started ||\n state.event.source !== event ||\n state.resourceId === state.origin.resourceId\n ) {\n return ids;\n }\n\n const others = (ids ?? []).filter((id) => id !== state.origin.resourceId);\n\n return state.resourceId === null || state.resourceId === undefined\n ? others\n : [...new Set([...others, state.resourceId])];\n }\n\n function isDragging(event: CalendarEvent<T>): boolean {\n return Boolean(drag.value?.started && drag.value.event.id === event.id);\n }\n\n function changed(state: DragState<T>): boolean {\n return (\n !state.preview.start.equals(state.event.start as never) ||\n !state.preview.end.equals(state.event.end as never) ||\n state.resourceId !== state.origin.resourceId\n );\n }\n\n function commit(state: DragState<T>) {\n if (!changed(state)) return;\n\n const detail: EventDropDetail<T> = {\n event: state.event.source,\n start: state.preview.start,\n end: state.preview.end,\n previousStart: state.event.start,\n previousEnd: state.event.end,\n allDay: state.event.allDay,\n };\n\n if (state.resourceId !== state.origin.resourceId) {\n detail.resourceId = state.resourceId;\n detail.previousResourceId = state.origin.resourceId;\n }\n\n if (state.kind === 'move') {\n options.onEventDrop?.(detail);\n } else {\n options.onEventResize?.(detail);\n }\n }\n\n function swallowNextClick() {\n const swallow = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.addEventListener('click', swallow, { capture: true, once: true });\n // If no click follows (the pointer left the element), don't eat a later one.\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 0);\n }\n\n function startPointerDrag(pointerEvent: PointerEvent, event: CalendarEvent<T>, kind: DragKind) {\n if (pointerEvent.button !== 0 || pointerEvent.pointerType === 'touch' || !canEdit(event))\n return;\n\n const origin = resolveTarget(pointerEvent.clientX, pointerEvent.clientY);\n\n if (!origin) return;\n\n // Stops the browser's own link drag and text selection, which would cancel the pointer.\n pointerEvent.preventDefault();\n\n if (kind !== 'move') {\n pointerEvent.stopPropagation();\n }\n\n drag.value = {\n kind,\n event,\n origin,\n started: false,\n keyboard: false,\n pointer: { x: pointerEvent.clientX, y: pointerEvent.clientY },\n preview: { start: event.start, end: event.end },\n resourceId: origin.resourceId,\n moveDelta: {},\n endDelta: {},\n };\n\n const onMove = (move: PointerEvent) => {\n const state = drag.value;\n\n if (!state) return;\n\n const distance = Math.hypot(\n move.clientX - state.pointer.x,\n move.clientY - state.pointer.y,\n );\n\n if (!state.started && distance < DRAG_THRESHOLD) return;\n\n const target = resolveTarget(move.clientX, move.clientY);\n\n if (target) {\n applyDrag(state, target);\n }\n };\n\n const finish = (cancelled: boolean) => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onEscape);\n\n const state = drag.value;\n drag.value = null;\n\n if (state?.started) {\n swallowNextClick();\n\n if (!cancelled) commit(state);\n }\n };\n\n const onUp = () => finish(false);\n const onCancel = () => finish(true);\n const onEscape = (key: KeyboardEvent) => key.key === 'Escape' && finish(true);\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onEscape);\n }\n\n function startSelection(pointerEvent: PointerEvent) {\n const element = pointerEvent.target as HTMLElement | null;\n\n if (\n !selectable.value ||\n pointerEvent.button !== 0 ||\n pointerEvent.pointerType === 'touch' ||\n element?.closest(NOT_SELECTION)\n ) {\n return;\n }\n\n const anchor = resolveTarget(pointerEvent.clientX, pointerEvent.clientY);\n\n if (!anchor) return;\n\n // Stops text selection while dragging, which also skips the click's focus, so focus by hand.\n pointerEvent.preventDefault();\n element?.closest<HTMLElement>('[role=\"gridcell\"]')?.focus();\n selection.value = { anchor, current: anchor };\n\n const onMove = (move: PointerEvent) => {\n const target = resolveTarget(move.clientX, move.clientY);\n\n if (target && target.kind === anchor.kind) {\n selection.value = { anchor, current: target };\n }\n };\n\n const finish = (cancelled: boolean) => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onEscape);\n\n const range = selectedRange.value;\n selection.value = null;\n\n if (!cancelled && range) {\n options.onRangeSelect?.(range.detail);\n }\n };\n\n const onUp = () => finish(false);\n const onCancel = () => finish(true);\n const onEscape = (key: KeyboardEvent) => key.key === 'Escape' && finish(true);\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onEscape);\n }\n\n const toZoned = (date: Temporal.PlainDate, minutes: number) =>\n date.toPlainDateTime({ hour: 0 }).add({ minutes }).toZonedDateTime(options.timeZone.value);\n\n /**\n * The selection in a form the layouts can draw: whole days for cells, a minute range on\n * the anchor's day for time columns, and axis minutes for timelines.\n */\n const selectedRange = computed(() => {\n const current = selection.value;\n\n if (!current) return null;\n\n const { anchor } = current;\n\n if (anchor.kind === 'day' || anchor.kind === 'dayaxis') {\n const [startDate, endDate] = orderedRange(anchor.date, current.current.date);\n\n return {\n kind: anchor.kind,\n resourceId: anchor.resourceId,\n startDate,\n endDate,\n detail: {\n start: startDate,\n end: endDate,\n allDay: true,\n resourceId: anchor.resourceId,\n },\n };\n }\n\n const step = snap.value;\n const absolute = (target: DropTarget) =>\n daysBetween(options.rangeStart.value, target.date) * 24 * 60 + target.minutes!;\n const sameDay = anchor.kind === 'time';\n const [low, high] = orderedRange(\n sameDay ? anchor.minutes! : absolute(anchor),\n sameDay ? current.current.minutes! : absolute(current.current),\n );\n const startAt = Math.floor(low / step) * step;\n const endAt = Math.max(Math.ceil(high / step) * step, startAt + step);\n\n const startDate = sameDay\n ? anchor.date\n : options.rangeStart.value.add({ days: Math.floor(startAt / 1440) });\n const startMinutes = sameDay ? startAt : startAt % 1440;\n const endDate = sameDay\n ? anchor.date\n : options.rangeStart.value.add({ days: Math.floor(endAt / 1440) });\n const endMinutes = sameDay ? endAt : endAt % 1440;\n\n return {\n kind: anchor.kind,\n resourceId: anchor.resourceId,\n startDate,\n endDate,\n startMinutes,\n endMinutes,\n detail: {\n start: toZoned(startDate, startMinutes),\n end: toZoned(endDate, endMinutes),\n allDay: false,\n resourceId: anchor.resourceId,\n },\n };\n });\n\n function describe(times: EventTimes): string {\n const format = (value: Temporal.PlainDate | Temporal.ZonedDateTime) =>\n value instanceof Temporal.PlainDate\n ? value.toLocaleString(options.locale.value, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n })\n : value.toLocaleString(options.locale.value, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n\n return `${format(times.start)} to ${format(times.end)}`;\n }\n\n async function refocus(event: CalendarEvent<T>) {\n await nextTick();\n\n const element = document.querySelector<HTMLElement>(\n `[data-event-id=\"${CSS.escape(String(event.id))}\"]`,\n );\n const target = element?.matches(FOCUSABLE)\n ? element\n : element?.querySelector<HTMLElement>(FOCUSABLE);\n\n target?.focus();\n }\n\n function keyboardPreview(state: DragState<T>): DragState<T> {\n const moved = moveEvent(state.event, state.moveDelta);\n const preview =\n state.endDelta.days || state.endDelta.minutes\n ? resizeEvent(withTimes(state.event, moved), 'end', state.endDelta, snap.value)\n : moved;\n\n return { ...state, preview };\n }\n\n let releaseKeyboard: (() => void) | null = null;\n\n function endKeyboardDrag() {\n releaseKeyboard?.();\n releaseKeyboard = null;\n }\n\n onScopeDispose(endKeyboardDrag);\n\n function handleHeldKey(keyboardEvent: KeyboardEvent) {\n const state = drag.value;\n\n if (!state?.keyboard) {\n endKeyboardDrag();\n\n return;\n }\n\n const event = state.event;\n const axes = state.axes!;\n\n if (keyboardEvent.key === 'Escape') {\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n drag.value = null;\n endKeyboardDrag();\n announcement.value = 'Move cancelled.';\n refocus(event);\n\n return;\n }\n\n if (keyboardEvent.key === ' ' || keyboardEvent.key === 'Enter') {\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n drag.value = null;\n endKeyboardDrag();\n commit({\n ...state,\n kind: state.endDelta.days || state.endDelta.minutes ? 'resize-end' : 'move',\n });\n announcement.value = `Dropped. ${describe(state.preview)}.`;\n refocus(event);\n\n return;\n }\n\n const directions: Record<string, [number, 'horizontal' | 'vertical']> = {\n ArrowLeft: [-1, 'horizontal'],\n ArrowRight: [1, 'horizontal'],\n ArrowUp: [-1, 'vertical'],\n ArrowDown: [1, 'vertical'],\n };\n const direction = directions[keyboardEvent.key];\n\n if (!direction) return;\n\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n\n const [sign, axis] = direction;\n const unit = axis === 'horizontal' ? axes.horizontal : axes.vertical;\n const resizing = keyboardEvent.shiftKey;\n const delta = { ...(resizing ? state.endDelta : state.moveDelta) };\n const step = event.allDay ? 0 : snap.value;\n let next: DragState<T> = state;\n\n if (unit === 'day') {\n delta.days = (delta.days ?? 0) + sign;\n } else if (unit === 'week') {\n delta.days = (delta.days ?? 0) + sign * 7;\n } else if (unit === 'minutes' && step) {\n delta.minutes = (delta.minutes ?? 0) + sign * step;\n } else if (unit === 'resource' && axes.resourceOrder && !resizing) {\n const order = axes.resourceOrder;\n const index = order.indexOf(state.resourceId ?? null);\n\n next = {\n ...state,\n resourceId: order[Math.min(Math.max(index + sign, 0), order.length - 1)],\n };\n } else {\n return;\n }\n\n if (unit !== 'resource') {\n next = resizing ? { ...next, endDelta: delta } : { ...next, moveDelta: delta };\n }\n\n next = keyboardPreview(next);\n drag.value = next;\n announcement.value = describe(next.preview);\n refocus(event);\n }\n\n /**\n * Space picks an event up; then arrows move it (Shift+arrows stretch its end), Space or\n * Enter drops it, and Escape puts it back. While it's held, keys are read on the window:\n * each move re-renders the event in its new cell, which briefly takes focus away.\n */\n function handleEventKeydown(\n keyboardEvent: KeyboardEvent,\n event: CalendarEvent<T>,\n axes: KeyboardAxes,\n resourceId?: ResourceId | null,\n ) {\n if (keyboardEvent.key !== ' ' || drag.value || !canEdit(event)) return;\n\n keyboardEvent.preventDefault();\n drag.value = {\n kind: 'move',\n event,\n origin: { kind: 'day', date: event.startDate, minutes: null, resourceId },\n started: true,\n keyboard: true,\n pointer: { x: 0, y: 0 },\n preview: { start: event.start, end: event.end },\n resourceId,\n moveDelta: { days: 0, minutes: 0 },\n endDelta: { days: 0, minutes: 0 },\n axes,\n };\n announcement.value =\n 'Picked up. Arrow keys move it, Shift with arrows changes its end, Space drops it, Escape cancels.';\n\n window.addEventListener('keydown', handleHeldKey, { capture: true });\n releaseKeyboard = () =>\n window.removeEventListener('keydown', handleHeldKey, { capture: true });\n }\n\n return {\n editable,\n selectable,\n drag,\n selectedRange,\n announcement,\n displayEvents,\n displayResourceIds,\n canEdit,\n isDragging,\n startPointerDrag,\n startSelection,\n handleEventKeydown,\n };\n}\n","import {\n computed,\n inject,\n onScopeDispose,\n provide,\n ref,\n toValue,\n type InjectionKey,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue';\nimport {\n createGantt,\n createMonthGrid,\n createResourceGrid,\n createTimeGrid,\n createTimeline,\n isSamePeriod,\n localTimeZone,\n navigate,\n normalizeEvents,\n periodRange,\n periodTitle,\n type CalendarEventInput,\n type CalendarResource,\n type CalendarView,\n type GanttLinkInput,\n type GanttScale,\n type ResourceId,\n type WeekDay,\n} from '@calends/core';\nimport {\n useInteractions,\n type EventDropDetail,\n type RangeSelectDetail,\n} from './useInteractions.js';\n\nexport interface UseCalendarOptions<T extends CalendarEventInput> {\n date: Ref<Temporal.PlainDate>;\n events?: MaybeRefOrGetter<readonly T[]>;\n view?: MaybeRefOrGetter<CalendarView>;\n weekStartsOn?: MaybeRefOrGetter<WeekDay>;\n timeZone?: MaybeRefOrGetter<string | undefined>;\n locale?: MaybeRefOrGetter<string | undefined>;\n fixedWeeks?: MaybeRefOrGetter<boolean>;\n maxLanes?: MaybeRefOrGetter<number | undefined>;\n today?: MaybeRefOrGetter<Temporal.PlainDate | undefined>;\n resources?: MaybeRefOrGetter<readonly CalendarResource[] | undefined>;\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n unassigned?: MaybeRefOrGetter<boolean | undefined>;\n /** The time grid's daily window, in minutes from midnight. */\n slotMinMinutes?: MaybeRefOrGetter<number | undefined>;\n slotMaxMinutes?: MaybeRefOrGetter<number | undefined>;\n /** Minutes per timeline header slot. */\n slotMinutes?: MaybeRefOrGetter<number | undefined>;\n /** Column width of the Gantt view. */\n ganttScale?: MaybeRefOrGetter<GanttScale | undefined>;\n /** Lines between Gantt rows, by event id. */\n ganttLinks?: MaybeRefOrGetter<readonly GanttLinkInput[] | undefined>;\n /** Lets events be moved and resized; the calendar reports the change and the app commits it. */\n editable?: MaybeRefOrGetter<boolean | undefined>;\n /** Lets people drag across empty cells or hours to select a range. */\n selectable?: MaybeRefOrGetter<boolean | undefined>;\n /** Minutes timed drags and selections snap to. */\n snapMinutes?: MaybeRefOrGetter<number | undefined>;\n canEdit?: (event: T) => boolean;\n onEventDrop?: (detail: EventDropDetail<T>) => void;\n onEventResize?: (detail: EventDropDetail<T>) => void;\n onRangeSelect?: (detail: RangeSelectDetail) => void;\n}\n\nexport function useCalendar<T extends CalendarEventInput>(options: UseCalendarOptions<T>) {\n const { date } = options;\n const view = computed(() => toValue(options.view) ?? 'month');\n const weekStartsOn = computed(() => toValue(options.weekStartsOn) ?? 7);\n const timeZone = computed(() => toValue(options.timeZone) ?? localTimeZone());\n const locale = computed(() => toValue(options.locale));\n const now = ref(Temporal.Now.zonedDateTimeISO(timeZone.value)) as Ref<Temporal.ZonedDateTime>;\n\n // SSR never disposes component scopes, so a server-side interval would leak per render.\n if (typeof window !== 'undefined') {\n const ticker = setInterval(\n () => (now.value = Temporal.Now.zonedDateTimeISO(timeZone.value)),\n 60_000,\n );\n\n onScopeDispose(() => clearInterval(ticker));\n }\n\n const today = computed(\n () => toValue(options.today) ?? now.value.withTimeZone(timeZone.value).toPlainDate(),\n );\n const focusedDate = ref(date.value) as Ref<Temporal.PlainDate>;\n /** The event under the pointer or focus, so every segment of it can highlight together. */\n const highlightedEventId = ref<string | number | null>(null);\n\n const events = computed(() =>\n normalizeEvents(toValue(options.events) ?? [], { timeZone: timeZone.value }),\n );\n\n /** The period's own days; the month grid pads these out to whole weeks. */\n const range = computed(() => periodRange(date.value, view.value, weekStartsOn.value));\n\n const interactions = useInteractions<T>({\n events,\n resources: options.resources,\n getResourceIds: options.getResourceIds,\n timeZone,\n locale,\n rangeStart: computed(() => range.value.start),\n slotMinMinutes: options.slotMinMinutes,\n slotMaxMinutes: options.slotMaxMinutes,\n editable: options.editable,\n selectable: options.selectable,\n snapMinutes: options.snapMinutes,\n canEdit: options.canEdit,\n onEventDrop: options.onEventDrop,\n onEventResize: options.onEventResize,\n onRangeSelect: options.onRangeSelect,\n });\n\n const resources = computed(() => toValue(options.resources));\n const displayEvents = interactions.displayEvents;\n const displayResourceIds = (event: T) => interactions.displayResourceIds(event);\n\n const grid = computed(() =>\n createMonthGrid({\n date: date.value,\n events: displayEvents.value,\n weekStartsOn: weekStartsOn.value,\n fixedWeeks: toValue(options.fixedWeeks) ?? false,\n maxLanes: toValue(options.maxLanes),\n today: today.value,\n }),\n );\n\n const resourceGrid = computed(() =>\n createResourceGrid({\n ...range.value,\n resources: toValue(options.resources) ?? [],\n events: displayEvents.value,\n getResourceIds: displayResourceIds,\n unassigned: toValue(options.unassigned) ?? false,\n today: today.value,\n }),\n );\n\n const timeGrid = computed(() =>\n createTimeGrid({\n ...range.value,\n events: displayEvents.value,\n slotMinMinutes: toValue(options.slotMinMinutes) ?? 0,\n slotMaxMinutes: toValue(options.slotMaxMinutes) ?? 24 * 60,\n today: today.value,\n }),\n );\n\n /** Without `resources`, the timeline is a single row of every event. */\n const timeline = computed(() =>\n createTimeline({\n ...range.value,\n events: displayEvents.value,\n resources: resources.value,\n getResourceIds: displayResourceIds,\n unassigned: toValue(options.unassigned) ?? false,\n slotMinMinutes: toValue(options.slotMinMinutes) ?? 0,\n slotMaxMinutes: toValue(options.slotMaxMinutes) ?? 24 * 60,\n slotMinutes: toValue(options.slotMinutes) ?? 60,\n today: today.value,\n }),\n );\n\n /** Fitted to the undragged events, so the axis holds still while a drag previews. */\n const gantt = computed(() =>\n createGantt({\n events: displayEvents.value,\n rangeEvents: events.value,\n scale: toValue(options.ganttScale) ?? 'week',\n weekStartsOn: weekStartsOn.value,\n today: today.value,\n links: toValue(options.ganttLinks) ?? [],\n }),\n );\n\n /** Row index of the focused resource cell, alongside `focusedDate`. */\n const focusedRow = ref(0);\n\n const title = computed(() =>\n periodTitle(date.value, view.value, weekStartsOn.value, locale.value),\n );\n\n const visibleRange = computed(() => ({ start: grid.value.start, end: grid.value.end }));\n\n function setDate(value: Temporal.PlainDate) {\n date.value = value;\n focusedDate.value = value;\n }\n\n /** Moves focus, and pages the view when the date leaves the current period. */\n function focusDate(value: Temporal.PlainDate) {\n focusedDate.value = value;\n\n if (!isSamePeriod(value, date.value, view.value, weekStartsOn.value)) {\n date.value = value;\n }\n }\n\n return {\n date,\n view,\n weekStartsOn,\n timeZone,\n locale,\n now,\n today,\n focusedDate,\n focusedRow,\n highlightedEventId,\n events,\n resources,\n grid,\n range,\n resourceGrid,\n timeGrid,\n timeline,\n gantt,\n title,\n visibleRange,\n setDate,\n focusDate,\n prev: () => setDate(navigate(date.value, view.value, -1)),\n next: () => setDate(navigate(date.value, view.value, 1)),\n goToToday: () => setDate(today.value),\n ...interactions,\n };\n}\n\nexport type CalendarContext = ReturnType<typeof useCalendar>;\n\nconst CALENDAR_CONTEXT: InjectionKey<CalendarContext> = Symbol('CalendarContext');\n\n/** Children see events as plain `CalendarEventInput`, so the root's event type is erased here. */\nexport function provideCalendarContext<T extends CalendarEventInput>(\n context: ReturnType<typeof useCalendar<T>>,\n) {\n provide(CALENDAR_CONTEXT, context as unknown as CalendarContext);\n}\n\nexport function injectCalendarContext(component: string): CalendarContext {\n const context = inject(CALENDAR_CONTEXT, null);\n\n if (!context) {\n throw new Error(`<${component}> must be used inside <CalendarRoot>.`);\n }\n\n return context;\n}\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'h2' });\n\nconst { title } = injectCalendarContext('CalendarHeading');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n aria-live=\"polite\"\n >\n <slot :title=\"title\">{{ title }}</slot>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'h2' });\n\nconst { title } = injectCalendarContext('CalendarHeading');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n aria-live=\"polite\"\n >\n <slot :title=\"title\">{{ title }}</slot>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { isSamePeriod } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { action: 'prev' | 'next' | 'today' }>(), {\n as: 'button',\n});\n\nconst calendar = injectCalendarContext('CalendarNav');\n\nconst showsToday = computed(\n () =>\n props.action === 'today' &&\n isSamePeriod(\n calendar.date.value,\n calendar.today.value,\n calendar.view.value,\n calendar.weekStartsOn.value,\n ),\n);\n\nfunction run() {\n if (props.action === 'prev') {\n calendar.prev();\n } else if (props.action === 'next') {\n calendar.next();\n } else {\n calendar.goToToday();\n }\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :data-action=\"action\"\n :data-current=\"showsToday ? '' : undefined\"\n @click=\"run\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { isSamePeriod } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { action: 'prev' | 'next' | 'today' }>(), {\n as: 'button',\n});\n\nconst calendar = injectCalendarContext('CalendarNav');\n\nconst showsToday = computed(\n () =>\n props.action === 'today' &&\n isSamePeriod(\n calendar.date.value,\n calendar.today.value,\n calendar.view.value,\n calendar.weekStartsOn.value,\n ),\n);\n\nfunction run() {\n if (props.action === 'prev') {\n calendar.prev();\n } else if (props.action === 'next') {\n calendar.next();\n } else {\n calendar.goToToday();\n }\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :data-action=\"action\"\n :data-current=\"showsToday ? '' : undefined\"\n @click=\"run\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends CalendarEventInput\">\nimport { watch } from 'vue';\nimport type {\n CalendarEventInput,\n CalendarResource,\n CalendarView,\n GanttLinkInput,\n GanttScale,\n ResourceId,\n WeekDay,\n} from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { provideCalendarContext, useCalendar } from './useCalendar.js';\nimport type { EventDropDetail, RangeSelectDetail } from './useInteractions.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n events?: readonly T[];\n view?: CalendarView;\n weekStartsOn?: WeekDay;\n timeZone?: string;\n locale?: string;\n fixedWeeks?: boolean;\n maxLanes?: number;\n today?: Temporal.PlainDate;\n resources?: readonly CalendarResource[];\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n /** Adds a row for events whose resources aren't in `resources`. */\n unassigned?: boolean;\n slotMinMinutes?: number;\n slotMaxMinutes?: number;\n slotMinutes?: number;\n ganttScale?: GanttScale;\n ganttLinks?: readonly GanttLinkInput[];\n editable?: boolean;\n selectable?: boolean;\n snapMinutes?: number;\n canEdit?: (event: T) => boolean;\n }\n >(),\n { as: 'div', events: () => [], view: 'month', weekStartsOn: 7, fixedWeeks: false },\n);\n\nconst emit = defineEmits<{\n 'event-drop': [detail: EventDropDetail<T>];\n 'event-resize': [detail: EventDropDetail<T>];\n 'range-select': [detail: RangeSelectDetail];\n}>();\n\nconst date = defineModel<Temporal.PlainDate>('date', {\n default: () => Temporal.Now.plainDateISO(),\n});\n\nconst calendar = useCalendar<T>({\n date,\n events: () => props.events,\n view: () => props.view,\n weekStartsOn: () => props.weekStartsOn,\n timeZone: () => props.timeZone,\n locale: () => props.locale,\n fixedWeeks: () => props.fixedWeeks,\n maxLanes: () => props.maxLanes,\n today: () => props.today,\n resources: () => props.resources,\n getResourceIds: (event) => props.getResourceIds?.(event),\n unassigned: () => props.unassigned,\n slotMinMinutes: () => props.slotMinMinutes,\n slotMaxMinutes: () => props.slotMaxMinutes,\n slotMinutes: () => props.slotMinutes,\n ganttScale: () => props.ganttScale,\n ganttLinks: () => props.ganttLinks,\n editable: () => props.editable,\n selectable: () => props.selectable,\n snapMinutes: () => props.snapMinutes,\n canEdit: (event) => props.canEdit?.(event) ?? true,\n onEventDrop: (detail) => emit('event-drop', detail),\n onEventResize: (detail) => emit('event-resize', detail),\n onRangeSelect: (detail) => emit('range-select', detail),\n});\n\nwatch(date, (value) => {\n const { start, end } = calendar.range.value;\n const focused = calendar.focusedDate.value;\n\n if (\n Temporal.PlainDate.compare(focused, start) < 0 ||\n Temporal.PlainDate.compare(focused, end) > 0\n ) {\n calendar.focusedDate.value = value;\n }\n});\n\nprovideCalendarContext(calendar);\n\n/** Keyboard move announcements; inline so the package needs no stylesheet. */\nconst visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n} as const;\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-view=\"calendar.view.value\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :date=\"date\"\n :title=\"calendar.title.value\"\n :visible-range=\"calendar.visibleRange.value\"\n :prev=\"calendar.prev\"\n :next=\"calendar.next\"\n :go-to-today=\"calendar.goToToday\"\n />\n <div\n v-if=\"!asChild\"\n aria-live=\"polite\"\n :style=\"visuallyHidden\"\n >\n {{ calendar.announcement.value }}\n </div>\n </Primitive>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends CalendarEventInput\">\nimport { watch } from 'vue';\nimport type {\n CalendarEventInput,\n CalendarResource,\n CalendarView,\n GanttLinkInput,\n GanttScale,\n ResourceId,\n WeekDay,\n} from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { provideCalendarContext, useCalendar } from './useCalendar.js';\nimport type { EventDropDetail, RangeSelectDetail } from './useInteractions.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n events?: readonly T[];\n view?: CalendarView;\n weekStartsOn?: WeekDay;\n timeZone?: string;\n locale?: string;\n fixedWeeks?: boolean;\n maxLanes?: number;\n today?: Temporal.PlainDate;\n resources?: readonly CalendarResource[];\n getResourceIds?: (event: T) => readonly ResourceId[] | null | undefined;\n /** Adds a row for events whose resources aren't in `resources`. */\n unassigned?: boolean;\n slotMinMinutes?: number;\n slotMaxMinutes?: number;\n slotMinutes?: number;\n ganttScale?: GanttScale;\n ganttLinks?: readonly GanttLinkInput[];\n editable?: boolean;\n selectable?: boolean;\n snapMinutes?: number;\n canEdit?: (event: T) => boolean;\n }\n >(),\n { as: 'div', events: () => [], view: 'month', weekStartsOn: 7, fixedWeeks: false },\n);\n\nconst emit = defineEmits<{\n 'event-drop': [detail: EventDropDetail<T>];\n 'event-resize': [detail: EventDropDetail<T>];\n 'range-select': [detail: RangeSelectDetail];\n}>();\n\nconst date = defineModel<Temporal.PlainDate>('date', {\n default: () => Temporal.Now.plainDateISO(),\n});\n\nconst calendar = useCalendar<T>({\n date,\n events: () => props.events,\n view: () => props.view,\n weekStartsOn: () => props.weekStartsOn,\n timeZone: () => props.timeZone,\n locale: () => props.locale,\n fixedWeeks: () => props.fixedWeeks,\n maxLanes: () => props.maxLanes,\n today: () => props.today,\n resources: () => props.resources,\n getResourceIds: (event) => props.getResourceIds?.(event),\n unassigned: () => props.unassigned,\n slotMinMinutes: () => props.slotMinMinutes,\n slotMaxMinutes: () => props.slotMaxMinutes,\n slotMinutes: () => props.slotMinutes,\n ganttScale: () => props.ganttScale,\n ganttLinks: () => props.ganttLinks,\n editable: () => props.editable,\n selectable: () => props.selectable,\n snapMinutes: () => props.snapMinutes,\n canEdit: (event) => props.canEdit?.(event) ?? true,\n onEventDrop: (detail) => emit('event-drop', detail),\n onEventResize: (detail) => emit('event-resize', detail),\n onRangeSelect: (detail) => emit('range-select', detail),\n});\n\nwatch(date, (value) => {\n const { start, end } = calendar.range.value;\n const focused = calendar.focusedDate.value;\n\n if (\n Temporal.PlainDate.compare(focused, start) < 0 ||\n Temporal.PlainDate.compare(focused, end) > 0\n ) {\n calendar.focusedDate.value = value;\n }\n});\n\nprovideCalendarContext(calendar);\n\n/** Keyboard move announcements; inline so the package needs no stylesheet. */\nconst visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n whiteSpace: 'nowrap',\n} as const;\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-view=\"calendar.view.value\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :date=\"date\"\n :title=\"calendar.title.value\"\n :visible-range=\"calendar.visibleRange.value\"\n :prev=\"calendar.prev\"\n :next=\"calendar.next\"\n :go-to-today=\"calendar.goToToday\"\n />\n <div\n v-if=\"!asChild\"\n aria-live=\"polite\"\n :style=\"visuallyHidden\"\n >\n {{ calendar.announcement.value }}\n </div>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'div',\n});\n\nconst calendar = injectCalendarContext('MonthDay');\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n Temporal.PlainDate.compare(props.day.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.day.date, range.endDate) <= 0\n );\n});\n\nconst isFocused = computed(() => props.day.date.equals(calendar.focusedDate.value));\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.day.eventCount;\n\n return count ? `${date}, ${count} ${count === 1 ? 'event' : 'events'}` : date;\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :aria-current=\"day.isToday ? 'date' : undefined\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-outside=\"day.isOutside ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-overflow=\"day.hiddenCount ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n @focus=\"calendar.focusedDate.value = day.date\"\n >\n <slot\n :day=\"day\"\n :segments=\"day.segments\"\n :covering-segments=\"day.coveringSegments\"\n :hidden-count=\"day.hiddenCount\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'div',\n});\n\nconst calendar = injectCalendarContext('MonthDay');\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n Temporal.PlainDate.compare(props.day.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.day.date, range.endDate) <= 0\n );\n});\n\nconst isFocused = computed(() => props.day.date.equals(calendar.focusedDate.value));\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.day.eventCount;\n\n return count ? `${date}, ${count} ${count === 1 ? 'event' : 'events'}` : date;\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :aria-current=\"day.isToday ? 'date' : undefined\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-outside=\"day.isOutside ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-overflow=\"day.hiddenCount ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n @focus=\"calendar.focusedDate.value = day.date\"\n >\n <slot\n :day=\"day\"\n :segments=\"day.segments\"\n :covering-segments=\"day.coveringSegments\"\n :hidden-count=\"day.hiddenCount\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders nothing on days where every event fits, so the recipe can place it unconditionally. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'button',\n});\n\nconst { locale } = injectCalendarContext('MonthDayMore');\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(locale.value, { month: 'long', day: 'numeric' });\n\n return `Show all ${props.day.eventCount} events on ${date}`;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"day.hiddenCount\"\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :aria-label=\"label\"\n data-calendar-control\n >\n <slot\n :hidden-count=\"day.hiddenCount\"\n :event-count=\"day.eventCount\"\n >+{{ day.hiddenCount }} more</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { MonthDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders nothing on days where every event fits, so the recipe can place it unconditionally. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: MonthDay<any> }>(), {\n as: 'button',\n});\n\nconst { locale } = injectCalendarContext('MonthDayMore');\n\nconst label = computed(() => {\n const date = props.day.date.toLocaleString(locale.value, { month: 'long', day: 'numeric' });\n\n return `Show all ${props.day.eventCount} events on ${date}`;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"day.hiddenCount\"\n :as=\"as\"\n :as-child=\"asChild\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :aria-label=\"label\"\n data-calendar-control\n >\n <slot\n :hidden-count=\"day.hiddenCount\"\n :event-count=\"day.eventCount\"\n >+{{ day.hiddenCount }} more</slot\n >\n </Primitive>\n</template>\n","import { computed, inject, provide, toValue, type InjectionKey, type MaybeRefOrGetter } from 'vue';\nimport type { CalendarEvent, ResourceId } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\ninterface EventPrimitiveContext {\n event: () => CalendarEvent<any>;\n}\n\nconst EVENT_CONTEXT: InjectionKey<EventPrimitiveContext> = Symbol('CalendarEventPrimitive');\n\n/**\n * Past, highlighted, editable, and dragging state shared by every way of drawing an event,\n * plus its pointer and key handlers. Highlighting goes through the calendar context so every\n * piece of one event (each week's bar, each day of an overnight event) lights up together.\n */\nexport function useEventState(\n component: string,\n event: MaybeRefOrGetter<CalendarEvent<any>>,\n interaction: {\n axes: MaybeRefOrGetter<KeyboardAxes>;\n resourceId?: MaybeRefOrGetter<ResourceId | null | undefined>;\n },\n) {\n const calendar = injectCalendarContext(component);\n const { now, today, highlightedEventId } = calendar;\n\n provide(EVENT_CONTEXT, { event: () => toValue(event) });\n\n const isHighlighted = computed(() => highlightedEventId.value === toValue(event).id);\n const isEditable = computed(() => calendar.canEdit(toValue(event)));\n const isDragging = computed(() => calendar.isDragging(toValue(event)));\n\n const isPast = computed(() => {\n const { allDay, end, endDate } = toValue(event);\n\n return allDay\n ? Temporal.PlainDate.compare(endDate, today.value) < 0\n : Temporal.ZonedDateTime.compare(end as Temporal.ZonedDateTime, now.value) < 0;\n });\n\n function highlight() {\n highlightedEventId.value = toValue(event).id;\n }\n\n function unhighlight() {\n if (isHighlighted.value) {\n highlightedEventId.value = null;\n }\n }\n\n function onPointerdown(pointerEvent: PointerEvent) {\n calendar.startPointerDrag(pointerEvent, toValue(event), 'move');\n }\n\n function onKeydown(keyboardEvent: KeyboardEvent) {\n calendar.handleEventKeydown(\n keyboardEvent,\n toValue(event),\n toValue(interaction.axes),\n toValue(interaction.resourceId),\n );\n }\n\n return {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n };\n}\n\nexport function injectEventPrimitive(component: string): EventPrimitiveContext {\n const context = inject(EVENT_CONTEXT, null);\n\n if (!context) {\n throw new Error(`<${component}> must be used inside an event primitive.`);\n }\n\n return context;\n}\n","<script setup lang=\"ts\">\nimport type { EventSegment, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\n/**\n * Exposes its placement as CSS variables (column, span, and lane) rather than inline\n * geometry, so the recipe decides how bars are drawn.\n */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n segment: EventSegment<any>;\n /** How arrow keys move it once picked up; a month grid moves by days and weeks. */\n keyboardAxes?: KeyboardAxes;\n /** The resource row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n {\n as: 'div',\n keyboardAxes: () => ({ horizontal: 'day', vertical: 'week' }),\n resourceId: undefined,\n },\n);\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('EventBar', () => props.segment.event, {\n axes: () => props.keyboardAxes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-column': segment.column,\n '--event-span': segment.span,\n '--event-lane': segment.lane,\n }\"\n :data-event-id=\"segment.event.id\"\n :data-all-day=\"segment.event.allDay ? '' : undefined\"\n :data-continues-before=\"segment.continuesBefore ? '' : undefined\"\n :data-continues-after=\"segment.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"segment.event\"\n :segment=\"segment\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { EventSegment, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\nimport type { KeyboardAxes } from './useInteractions.js';\n\n/**\n * Exposes its placement as CSS variables (column, span, and lane) rather than inline\n * geometry, so the recipe decides how bars are drawn.\n */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n segment: EventSegment<any>;\n /** How arrow keys move it once picked up; a month grid moves by days and weeks. */\n keyboardAxes?: KeyboardAxes;\n /** The resource row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n {\n as: 'div',\n keyboardAxes: () => ({ horizontal: 'day', vertical: 'week' }),\n resourceId: undefined,\n },\n);\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('EventBar', () => props.segment.event, {\n axes: () => props.keyboardAxes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-column': segment.column,\n '--event-span': segment.span,\n '--event-lane': segment.lane,\n }\"\n :data-event-id=\"segment.event.id\"\n :data-all-day=\"segment.event.allDay ? '' : undefined\"\n :data-continues-before=\"segment.continuesBefore ? '' : undefined\"\n :data-continues-after=\"segment.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"segment.event\"\n :segment=\"segment\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { injectEventPrimitive } from './useEventState.js';\n\n/**\n * Drags one edge of the event it sits in. Renders nothing unless the event is editable;\n * the recipe positions it (`data-edge` says which).\n */\nwithDefaults(defineProps<PrimitiveProps & { edge: 'start' | 'end' }>(), { as: 'span' });\n\nconst calendar = injectCalendarContext('EventResizeHandle');\nconst { event } = injectEventPrimitive('EventResizeHandle');\n</script>\n\n<template>\n <Primitive\n v-if=\"calendar.canEdit(event())\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n data-calendar-control\n :data-edge=\"edge\"\n @pointerdown=\"\n calendar.startPointerDrag(\n $event,\n event(),\n edge === 'start' ? 'resize-start' : 'resize-end',\n )\n \"\n @click.prevent.stop\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { injectEventPrimitive } from './useEventState.js';\n\n/**\n * Drags one edge of the event it sits in. Renders nothing unless the event is editable;\n * the recipe positions it (`data-edge` says which).\n */\nwithDefaults(defineProps<PrimitiveProps & { edge: 'start' | 'end' }>(), { as: 'span' });\n\nconst calendar = injectCalendarContext('EventResizeHandle');\nconst { event } = injectEventPrimitive('EventResizeHandle');\n</script>\n\n<template>\n <Primitive\n v-if=\"calendar.canEdit(event())\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n data-calendar-control\n :data-edge=\"edge\"\n @pointerdown=\"\n calendar.startPointerDrag(\n $event,\n event(),\n edge === 'start' ? 'resize-start' : 'resize-end',\n )\n \"\n @click.prevent.stop\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes `--axis-days` so the recipe can size the track and place bars, columns, and today. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Gantt');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-scale=\"calendar.gantt.value.scale\"\n :style=\"{ '--axis-days': calendar.gantt.value.axisDays }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :gantt=\"calendar.gantt.value\"\n :rows=\"calendar.gantt.value.rows\"\n :columns=\"calendar.gantt.value.columns\"\n :groups=\"calendar.gantt.value.groups\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes `--axis-days` so the recipe can size the track and place bars, columns, and today. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Gantt');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-scale=\"calendar.gantt.value.scale\"\n :style=\"{ '--axis-days': calendar.gantt.value.axisDays }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :gantt=\"calendar.gantt.value\"\n :rows=\"calendar.gantt.value.rows\"\n :columns=\"calendar.gantt.value.columns\"\n :groups=\"calendar.gantt.value.groups\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--bar-start` and `--bar-end`, in days from the start of the axis. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('GanttBar', () => props.row.event, {\n axes: { horizontal: 'day', vertical: 'none' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{ '--bar-start': row.startOffset, '--bar-end': row.endOffset }\"\n :data-event-id=\"row.event.id\"\n :data-continues-before=\"row.continuesBefore ? '' : undefined\"\n :data-continues-after=\"row.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"row.event\"\n :row=\"row\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--bar-start` and `--bar-end`, in days from the start of the axis. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('GanttBar', () => props.row.event, {\n axes: { horizontal: 'day', vertical: 'none' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{ '--bar-start': row.startOffset, '--bar-end': row.endOffset }\"\n :data-event-id=\"row.event.id\"\n :data-continues-before=\"row.continuesBefore ? '' : undefined\"\n :data-continues-after=\"row.continuesAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"row.event\"\n :row=\"row\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport { ganttLinkArrow, roundedPath, routeGanttLink, type GanttLink } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * An SVG overlay of the links between rows. Lay it over the rows (absolute, the same box)\n * inside the scrolled content: it measures the rendered bars, so it follows any zoom, row\n * height, or drag preview. The slot draws each link from its `path` and `arrow`.\n */\nconst props = withDefaults(\n defineProps<{\n /** How far a line runs straight out of a bar and into the next, in pixels. */\n gap?: number;\n radius?: number;\n arrowSize?: number;\n }>(),\n { gap: 12, radius: 6, arrowSize: 5 },\n);\n\nconst calendar = injectCalendarContext('GanttLinks');\n\nconst svg = ref<SVGSVGElement | null>(null);\n\ninterface MeasuredLink {\n link: GanttLink<any>;\n path: string;\n arrow: string;\n}\n\nconst measured = shallowRef<MeasuredLink[]>([]);\n\nconst find = (container: Element, attribute: string, id: string | number) =>\n container.querySelector(`[${attribute}=\"${CSS.escape(String(id))}\"]`);\n\nfunction measure() {\n const container = svg.value?.parentElement;\n\n if (!svg.value || !container) {\n return;\n }\n\n const origin = svg.value.getBoundingClientRect();\n\n measured.value = calendar.gantt.value.links.flatMap((link) => {\n const fromBar = find(container, 'data-event-id', link.from.event.id);\n const toBar = find(container, 'data-event-id', link.to.event.id);\n const fromRow = find(container, 'data-row-event-id', link.from.event.id);\n\n if (!fromBar || !toBar || !fromRow) {\n return [];\n }\n\n const fromRect = fromBar.getBoundingClientRect();\n const toRect = toBar.getBoundingClientRect();\n const rowRect = fromRow.getBoundingClientRect();\n const from = {\n x: fromRect.right - origin.left,\n y: fromRect.top + fromRect.height / 2 - origin.top,\n };\n const to = {\n x: toRect.left - origin.left,\n y: toRect.top + toRect.height / 2 - origin.top,\n };\n const gutterY = (to.y > from.y ? rowRect.bottom : rowRect.top) - origin.top;\n\n return [\n {\n link,\n path: roundedPath(\n routeGanttLink(from, to, { gap: props.gap, gutterY }),\n props.radius,\n ),\n arrow: ganttLinkArrow(to, props.arrowSize),\n },\n ];\n });\n}\n\nlet frame = 0;\n\nconst scheduleMeasure = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(measure);\n};\n\nlet observer: ResizeObserver | undefined;\n\nonMounted(() => {\n observer = new ResizeObserver(scheduleMeasure);\n\n if (svg.value?.parentElement) {\n observer.observe(svg.value.parentElement);\n }\n\n nextTick(scheduleMeasure);\n});\n\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame);\n observer?.disconnect();\n});\n\nwatch(calendar.gantt, () => nextTick(scheduleMeasure));\n\n/** A highlighted bar lights its own links and dims the rest. */\nconst links = computed(() => {\n const highlighted = calendar.highlightedEventId.value;\n\n return measured.value.map((item) => {\n const touches =\n highlighted !== null &&\n (item.link.from.event.id === highlighted || item.link.to.event.id === highlighted);\n\n return { ...item, highlighted: touches, dimmed: highlighted !== null && !touches };\n });\n});\n</script>\n\n<template>\n <svg\n ref=\"svg\"\n aria-hidden=\"true\"\n >\n <slot :links=\"links\" />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport { ganttLinkArrow, roundedPath, routeGanttLink, type GanttLink } from '@calends/core';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * An SVG overlay of the links between rows. Lay it over the rows (absolute, the same box)\n * inside the scrolled content: it measures the rendered bars, so it follows any zoom, row\n * height, or drag preview. The slot draws each link from its `path` and `arrow`.\n */\nconst props = withDefaults(\n defineProps<{\n /** How far a line runs straight out of a bar and into the next, in pixels. */\n gap?: number;\n radius?: number;\n arrowSize?: number;\n }>(),\n { gap: 12, radius: 6, arrowSize: 5 },\n);\n\nconst calendar = injectCalendarContext('GanttLinks');\n\nconst svg = ref<SVGSVGElement | null>(null);\n\ninterface MeasuredLink {\n link: GanttLink<any>;\n path: string;\n arrow: string;\n}\n\nconst measured = shallowRef<MeasuredLink[]>([]);\n\nconst find = (container: Element, attribute: string, id: string | number) =>\n container.querySelector(`[${attribute}=\"${CSS.escape(String(id))}\"]`);\n\nfunction measure() {\n const container = svg.value?.parentElement;\n\n if (!svg.value || !container) {\n return;\n }\n\n const origin = svg.value.getBoundingClientRect();\n\n measured.value = calendar.gantt.value.links.flatMap((link) => {\n const fromBar = find(container, 'data-event-id', link.from.event.id);\n const toBar = find(container, 'data-event-id', link.to.event.id);\n const fromRow = find(container, 'data-row-event-id', link.from.event.id);\n\n if (!fromBar || !toBar || !fromRow) {\n return [];\n }\n\n const fromRect = fromBar.getBoundingClientRect();\n const toRect = toBar.getBoundingClientRect();\n const rowRect = fromRow.getBoundingClientRect();\n const from = {\n x: fromRect.right - origin.left,\n y: fromRect.top + fromRect.height / 2 - origin.top,\n };\n const to = {\n x: toRect.left - origin.left,\n y: toRect.top + toRect.height / 2 - origin.top,\n };\n const gutterY = (to.y > from.y ? rowRect.bottom : rowRect.top) - origin.top;\n\n return [\n {\n link,\n path: roundedPath(\n routeGanttLink(from, to, { gap: props.gap, gutterY }),\n props.radius,\n ),\n arrow: ganttLinkArrow(to, props.arrowSize),\n },\n ];\n });\n}\n\nlet frame = 0;\n\nconst scheduleMeasure = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(measure);\n};\n\nlet observer: ResizeObserver | undefined;\n\nonMounted(() => {\n observer = new ResizeObserver(scheduleMeasure);\n\n if (svg.value?.parentElement) {\n observer.observe(svg.value.parentElement);\n }\n\n nextTick(scheduleMeasure);\n});\n\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame);\n observer?.disconnect();\n});\n\nwatch(calendar.gantt, () => nextTick(scheduleMeasure));\n\n/** A highlighted bar lights its own links and dims the rest. */\nconst links = computed(() => {\n const highlighted = calendar.highlightedEventId.value;\n\n return measured.value.map((item) => {\n const touches =\n highlighted !== null &&\n (item.link.from.event.id === highlighted || item.link.to.event.id === highlighted);\n\n return { ...item, highlighted: touches, dimmed: highlighted !== null && !touches };\n });\n});\n</script>\n\n<template>\n <svg\n ref=\"svg\"\n aria-hidden=\"true\"\n >\n <slot :links=\"links\" />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-row-event-id=\"row.event.id\"\n >\n <slot\n :row=\"row\"\n :event=\"row.event\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { GanttRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: GanttRow<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :data-row-event-id=\"row.event.id\"\n >\n <slot\n :row=\"row\"\n :event=\"row.event\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only when today is on the axis; exposes `--today` in days from its start. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttToday');\n</script>\n\n<template>\n <Primitive\n v-if=\"gantt.todayOffset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--today': gantt.todayOffset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only when today is on the axis; exposes `--today` in days from its start. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttToday');\n</script>\n\n<template>\n <Primitive\n v-if=\"gantt.todayOffset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--today': gantt.todayOffset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's day axis: drops and selections are measured against its width. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"dayaxis\"\n :data-axis-start=\"gantt.start.toString()\"\n :data-axis-days=\"gantt.axisDays\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's day axis: drops and selections are measured against its width. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { gantt } = injectCalendarContext('GanttTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"dayaxis\"\n :data-axis-start=\"gantt.start.toString()\"\n :data-axis-days=\"gantt.axisDays\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { startOfWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('MonthGrid');\n\nfunction targetFor(event: KeyboardEvent, from: Temporal.PlainDate): Temporal.PlainDate | null {\n const weekStartsOn = calendar.grid.value.weekdays[0].dayOfWeek as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return from.subtract({ days: 1 });\n case 'ArrowRight':\n return from.add({ days: 1 });\n case 'ArrowUp':\n return from.subtract({ weeks: 1 });\n case 'ArrowDown':\n return from.add({ weeks: 1 });\n case 'Home':\n return startOfWeek(from, weekStartsOn);\n case 'End':\n return startOfWeek(from, weekStartsOn).add({ days: 6 });\n case 'PageUp':\n return from.subtract(event.shiftKey ? { years: 1 } : { months: 1 });\n case 'PageDown':\n return from.add(event.shiftKey ? { years: 1 } : { months: 1 });\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a day cell, so arrows inside an event link or an input still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusDate(target);\n\n await nextTick();\n grid.querySelector<HTMLElement>(`[data-date=\"${target.toString()}\"]`)?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :weekdays=\"calendar.grid.value.weekdays\"\n :weeks=\"calendar.grid.value.weeks\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { startOfWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('MonthGrid');\n\nfunction targetFor(event: KeyboardEvent, from: Temporal.PlainDate): Temporal.PlainDate | null {\n const weekStartsOn = calendar.grid.value.weekdays[0].dayOfWeek as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return from.subtract({ days: 1 });\n case 'ArrowRight':\n return from.add({ days: 1 });\n case 'ArrowUp':\n return from.subtract({ weeks: 1 });\n case 'ArrowDown':\n return from.add({ weeks: 1 });\n case 'Home':\n return startOfWeek(from, weekStartsOn);\n case 'End':\n return startOfWeek(from, weekStartsOn).add({ days: 6 });\n case 'PageUp':\n return from.subtract(event.shiftKey ? { years: 1 } : { months: 1 });\n case 'PageDown':\n return from.add(event.shiftKey ? { years: 1 } : { months: 1 });\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a day cell, so arrows inside an event link or an input still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusDate(target);\n\n await nextTick();\n grid.querySelector<HTMLElement>(`[data-date=\"${target.toString()}\"]`)?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.grid.value\"\n :weekdays=\"calendar.grid.value.weekdays\"\n :weeks=\"calendar.grid.value.weeks\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { MonthWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { week: MonthWeek<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{\n '--week-lanes': week.visibleLaneCount + (week.hasOverflow ? 1 : 0),\n '--week-visible-lanes': week.visibleLaneCount,\n }\"\n :data-overflow=\"week.hasOverflow ? '' : undefined\"\n >\n <slot\n :week=\"week\"\n :days=\"week.days\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { MonthWeek } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { week: MonthWeek<any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{\n '--week-lanes': week.visibleLaneCount + (week.hasOverflow ? 1 : 0),\n '--week-visible-lanes': week.visibleLaneCount,\n }\"\n :data-overflow=\"week.hasOverflow ? '' : undefined\"\n >\n <slot\n :week=\"week\"\n :days=\"week.days\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { date: Temporal.PlainDate }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('MonthWeekday');\n\nconst label = computed(() => props.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst longLabel = computed(() => props.date.toLocaleString(locale.value, { weekday: 'long' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"longLabel\"\n :data-weekend=\"date.dayOfWeek >= 6 ? '' : undefined\"\n >\n <slot\n :label=\"label\"\n :long-label=\"longLabel\"\n >{{ label }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { date: Temporal.PlainDate }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('MonthWeekday');\n\nconst label = computed(() => props.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst longLabel = computed(() => props.date.toLocaleString(locale.value, { weekday: 'long' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"longLabel\"\n :data-weekend=\"date.dayOfWeek >= 6 ? '' : undefined\"\n >\n <slot\n :label=\"label\"\n :long-label=\"longLabel\"\n >{{ label }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes, type TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only in today's column and inside the visible window; exposes `--now` in minutes. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { now, timeZone, timeGrid } = injectCalendarContext('NowIndicator');\n\nconst minutes = computed(\n () => wallMinutes(now.value.withTimeZone(timeZone.value)) - timeGrid.value.slotMinMinutes,\n);\n\nconst isVisible = computed(\n () => props.day.isToday && minutes.value >= 0 && minutes.value <= timeGrid.value.windowMinutes,\n);\n</script>\n\n<template>\n <Primitive\n v-if=\"isVisible\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': minutes }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes, type TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only in today's column and inside the visible window; exposes `--now` in minutes. */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { now, timeZone, timeGrid } = injectCalendarContext('NowIndicator');\n\nconst minutes = computed(\n () => wallMinutes(now.value.withTimeZone(timeZone.value)) - timeGrid.value.slotMinMinutes,\n);\n\nconst isVisible = computed(\n () => props.day.isToday && minutes.value >= 0 && minutes.value <= timeGrid.value.windowMinutes,\n);\n</script>\n\n<template>\n <Primitive\n v-if=\"isVisible\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': minutes }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceCell, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n cell: ResourceCell<any>;\n /** Index of the row, for keyboard focus. */\n rowIndex: number;\n /** The resource's name, for the cell's accessible label. */\n resourceLabel?: string;\n /** The row's resource, null for the unassigned row, so drops and selections know it. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div' },\n);\n\nconst calendar = injectCalendarContext('ResourceCell');\n\nconst day = computed(() => calendar.resourceGrid.value.days[props.cell.column]);\n\nconst isFocused = computed(\n () =>\n props.rowIndex === calendar.focusedRow.value &&\n props.cell.date.equals(calendar.focusedDate.value),\n);\n\nconst label = computed(() => {\n const date = props.cell.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.cell.eventCount;\n const events = count ? `${count} ${count === 1 ? 'event' : 'events'}` : 'free';\n\n return [props.resourceLabel, date, events].filter(Boolean).join(', ');\n});\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n range.resourceId === props.resourceId &&\n Temporal.PlainDate.compare(props.cell.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.cell.date, range.endDate) <= 0\n );\n});\n\nfunction onFocus() {\n calendar.focusedRow.value = props.rowIndex;\n calendar.focusedDate.value = props.cell.date;\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :data-date=\"cell.date.toString()\"\n :data-row=\"rowIndex\"\n :data-today=\"day?.isToday ? '' : undefined\"\n :data-weekend=\"day?.isWeekend ? '' : undefined\"\n :data-busy=\"cell.eventCount ? '' : undefined\"\n :data-overlap=\"cell.hasOverlap ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n :data-resource-id=\"resourceId === undefined ? undefined : String(resourceId ?? '')\"\n @focus=\"onFocus\"\n >\n <slot\n :cell=\"cell\"\n :segments=\"cell.segments\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceCell, ResourceId } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n cell: ResourceCell<any>;\n /** Index of the row, for keyboard focus. */\n rowIndex: number;\n /** The resource's name, for the cell's accessible label. */\n resourceLabel?: string;\n /** The row's resource, null for the unassigned row, so drops and selections know it. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div' },\n);\n\nconst calendar = injectCalendarContext('ResourceCell');\n\nconst day = computed(() => calendar.resourceGrid.value.days[props.cell.column]);\n\nconst isFocused = computed(\n () =>\n props.rowIndex === calendar.focusedRow.value &&\n props.cell.date.equals(calendar.focusedDate.value),\n);\n\nconst label = computed(() => {\n const date = props.cell.date.toLocaleString(calendar.locale.value, { dateStyle: 'full' });\n const count = props.cell.eventCount;\n const events = count ? `${count} ${count === 1 ? 'event' : 'events'}` : 'free';\n\n return [props.resourceLabel, date, events].filter(Boolean).join(', ');\n});\n\nconst isSelected = computed(() => {\n const range = calendar.selectedRange.value;\n\n return (\n range?.kind === 'day' &&\n range.resourceId === props.resourceId &&\n Temporal.PlainDate.compare(props.cell.date, range.startDate) >= 0 &&\n Temporal.PlainDate.compare(props.cell.date, range.endDate) <= 0\n );\n});\n\nfunction onFocus() {\n calendar.focusedRow.value = props.rowIndex;\n calendar.focusedDate.value = props.cell.date;\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"gridcell\"\n :tabindex=\"isFocused ? 0 : -1\"\n :aria-label=\"label\"\n :data-date=\"cell.date.toString()\"\n :data-row=\"rowIndex\"\n :data-today=\"day?.isToday ? '' : undefined\"\n :data-weekend=\"day?.isWeekend ? '' : undefined\"\n :data-busy=\"cell.eventCount ? '' : undefined\"\n :data-overlap=\"cell.hasOverlap ? '' : undefined\"\n :data-focused=\"isFocused ? '' : undefined\"\n :data-selected=\"isSelected ? '' : undefined\"\n data-drop=\"day\"\n :data-resource-id=\"resourceId === undefined ? undefined : String(resourceId ?? '')\"\n @focus=\"onFocus\"\n >\n <slot\n :cell=\"cell\"\n :segments=\"cell.segments\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: ResourceDay }>(), { as: 'div' });\n\nconst { locale } = injectCalendarContext('ResourceDayHeader');\n\nconst weekday = computed(() => props.day.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"label\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n >\n <slot\n :day=\"day\"\n :weekday=\"weekday\"\n >{{ weekday }} {{ day.date.day }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: ResourceDay }>(), { as: 'div' });\n\nconst { locale } = injectCalendarContext('ResourceDayHeader');\n\nconst weekday = computed(() => props.day.date.toLocaleString(locale.value, { weekday: 'short' }));\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"columnheader\"\n :aria-label=\"label\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n >\n <slot\n :day=\"day\"\n :weekday=\"weekday\"\n >{{ weekday }} {{ day.date.day }}</slot\n >\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { navigate } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes the day count as `--day-count` so the recipe can size its columns. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('ResourceGrid');\n\nfunction targetFor(\n event: KeyboardEvent,\n date: Temporal.PlainDate,\n row: number,\n): { date: Temporal.PlainDate; row: number } | null {\n const lastRow = calendar.resourceGrid.value.rows.length - 1;\n const { start, end } = calendar.range.value;\n\n switch (event.key) {\n case 'ArrowLeft':\n return { date: date.subtract({ days: 1 }), row };\n case 'ArrowRight':\n return { date: date.add({ days: 1 }), row };\n case 'ArrowUp':\n return { date, row: Math.max(row - 1, 0) };\n case 'ArrowDown':\n return { date, row: Math.min(row + 1, lastRow) };\n case 'Home':\n return { date: event.ctrlKey ? date : start, row: event.ctrlKey ? 0 : row };\n case 'End':\n return { date: event.ctrlKey ? date : end, row: event.ctrlKey ? lastRow : row };\n case 'PageUp':\n return { date: navigate(date, calendar.view.value, -1), row };\n case 'PageDown':\n return { date: navigate(date, calendar.view.value, 1), row };\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a cell, so arrows inside an event link still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value, calendar.focusedRow.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusedRow.value = target.row;\n calendar.focusDate(target.date);\n\n await nextTick();\n grid.querySelector<HTMLElement>(\n `[data-row=\"${target.row}\"][data-date=\"${target.date.toString()}\"]`,\n )?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n :style=\"{ '--day-count': calendar.resourceGrid.value.days.length }\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.resourceGrid.value\"\n :days=\"calendar.resourceGrid.value.days\"\n :rows=\"calendar.resourceGrid.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { nextTick } from 'vue';\nimport { navigate } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Exposes the day count as `--day-count` so the recipe can size its columns. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('ResourceGrid');\n\nfunction targetFor(\n event: KeyboardEvent,\n date: Temporal.PlainDate,\n row: number,\n): { date: Temporal.PlainDate; row: number } | null {\n const lastRow = calendar.resourceGrid.value.rows.length - 1;\n const { start, end } = calendar.range.value;\n\n switch (event.key) {\n case 'ArrowLeft':\n return { date: date.subtract({ days: 1 }), row };\n case 'ArrowRight':\n return { date: date.add({ days: 1 }), row };\n case 'ArrowUp':\n return { date, row: Math.max(row - 1, 0) };\n case 'ArrowDown':\n return { date, row: Math.min(row + 1, lastRow) };\n case 'Home':\n return { date: event.ctrlKey ? date : start, row: event.ctrlKey ? 0 : row };\n case 'End':\n return { date: event.ctrlKey ? date : end, row: event.ctrlKey ? lastRow : row };\n case 'PageUp':\n return { date: navigate(date, calendar.view.value, -1), row };\n case 'PageDown':\n return { date: navigate(date, calendar.view.value, 1), row };\n default:\n return null;\n }\n}\n\n/** Keys only steer focus from a cell, so arrows inside an event link still work. */\nasync function onKeydown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const cell = event.target instanceof HTMLElement ? event.target : null;\n\n if (cell?.getAttribute('role') !== 'gridcell') {\n return;\n }\n\n const target = targetFor(event, calendar.focusedDate.value, calendar.focusedRow.value);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n calendar.focusedRow.value = target.row;\n calendar.focusDate(target.date);\n\n await nextTick();\n grid.querySelector<HTMLElement>(\n `[data-row=\"${target.row}\"][data-date=\"${target.date.toString()}\"]`,\n )?.focus();\n}\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"grid\"\n :aria-label=\"calendar.title.value\"\n :style=\"{ '--day-count': calendar.resourceGrid.value.days.length }\"\n @keydown=\"onKeydown\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.resourceGrid.value\"\n :days=\"calendar.resourceGrid.value.days\"\n :rows=\"calendar.resourceGrid.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"rowheader\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :busy-days=\"row.busyDays\"\n :overlap-days=\"row.overlapDays\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"rowheader\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :busy-days=\"row.busyDays\"\n :overlap-days=\"row.overlapDays\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.busyDays ? undefined : ''\"\n :data-overlap=\"row.overlapDays ? '' : undefined\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :cells=\"row.cells\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { ResourceRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: ResourceRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"row\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.busyDays ? undefined : ''\"\n :data-overlap=\"row.overlapDays ? '' : undefined\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :cells=\"row.cells\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('TimeColumn');\n\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"label\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n data-drop=\"time\"\n >\n <slot\n :day=\"day\"\n :events=\"day.events\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { locale } = injectCalendarContext('TimeColumn');\n\nconst label = computed(() => props.day.date.toLocaleString(locale.value, { dateStyle: 'full' }));\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"label\"\n :data-date=\"day.date.toString()\"\n :data-today=\"day.isToday ? '' : undefined\"\n :data-weekend=\"day.isWeekend ? '' : undefined\"\n data-drop=\"time\"\n >\n <slot\n :day=\"day\"\n :events=\"day.events\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimedEventLayout } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/**\n * Exposes its placement as CSS variables in minutes and columns; with the grid's\n * `--window-minutes`, the recipe turns those into `top`, `height`, `left`, and `width`.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { layout: TimedEventLayout<any> }>(), {\n as: 'div',\n});\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimeEvent', () => props.layout.event, {\n axes: { horizontal: 'day', vertical: 'minutes' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': layout.startMinutes,\n '--event-end': layout.endMinutes,\n '--event-column': layout.column,\n '--event-columns': layout.columnCount,\n }\"\n :data-event-id=\"layout.event.id\"\n :data-starts-before=\"layout.startsBefore ? '' : undefined\"\n :data-ends-after=\"layout.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"layout.event\"\n :layout=\"layout\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimedEventLayout } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { useEventState } from './useEventState.js';\n\n/**\n * Exposes its placement as CSS variables in minutes and columns; with the grid's\n * `--window-minutes`, the recipe turns those into `top`, `height`, `left`, and `width`.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { layout: TimedEventLayout<any> }>(), {\n as: 'div',\n});\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimeEvent', () => props.layout.event, {\n axes: { horizontal: 'day', vertical: 'minutes' },\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': layout.startMinutes,\n '--event-end': layout.endMinutes,\n '--event-column': layout.column,\n '--event-columns': layout.columnCount,\n }\"\n :data-event-id=\"layout.event.id\"\n :data-starts-before=\"layout.startsBefore ? '' : undefined\"\n :data-ends-after=\"layout.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"layout.event\"\n :layout=\"layout\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--day-count` and `--window-minutes` so the recipe can size columns and turn an\n * event's minutes into a position. Events inside are links, reached with Tab.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('TimeGrid');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--day-count': calendar.timeGrid.value.days.length,\n '--window-minutes': calendar.timeGrid.value.windowMinutes,\n '--all-day-lanes': calendar.timeGrid.value.allDay.laneCount,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.timeGrid.value\"\n :days=\"calendar.timeGrid.value.days\"\n :all-day=\"calendar.timeGrid.value.allDay\"\n :hours=\"calendar.timeGrid.value.hours\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--day-count` and `--window-minutes` so the recipe can size columns and turn an\n * event's minutes into a position. Events inside are links, reached with Tab.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('TimeGrid');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--day-count': calendar.timeGrid.value.days.length,\n '--window-minutes': calendar.timeGrid.value.windowMinutes,\n '--all-day-lanes': calendar.timeGrid.value.allDay.laneCount,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :grid=\"calendar.timeGrid.value\"\n :days=\"calendar.timeGrid.value.days\"\n :all-day=\"calendar.timeGrid.value.allDay\"\n :hours=\"calendar.timeGrid.value.hours\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out in one day's hours. Renders only in that day's column;\n * exposes `--selection-start` and `--selection-end` in minutes from the top of the window.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeGrid } = injectCalendarContext('TimeSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n\n if (selected?.kind !== 'time' || !selected.startDate.equals(props.day.date)) return null;\n\n const offset = timeGrid.value.slotMinMinutes;\n\n return { start: selected.startMinutes! - offset, end: selected.endMinutes! - offset };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { TimeGridDay } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out in one day's hours. Renders only in that day's column;\n * exposes `--selection-start` and `--selection-end` in minutes from the top of the window.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { day: TimeGridDay<any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeGrid } = injectCalendarContext('TimeSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n\n if (selected?.kind !== 'time' || !selected.startDate.equals(props.day.date)) return null;\n\n const offset = timeGrid.value.slotMinMinutes;\n\n return { start: selected.startMinutes! - offset, end: selected.endMinutes! - offset };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--axis-minutes`, `--window-minutes`, `--slot-minutes`, and `--slot-count` so the\n * recipe can size the track and turn an event's axis minutes into `left` and `width`.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Timeline');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--axis-minutes': calendar.timeline.value.axisMinutes,\n '--window-minutes': calendar.timeline.value.windowMinutes,\n '--slot-minutes': calendar.timeline.value.slotMinutes,\n '--slot-count':\n calendar.timeline.value.axisMinutes / calendar.timeline.value.slotMinutes,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :timeline=\"calendar.timeline.value\"\n :days=\"calendar.timeline.value.days\"\n :rows=\"calendar.timeline.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * Exposes `--axis-minutes`, `--window-minutes`, `--slot-minutes`, and `--slot-count` so the\n * recipe can size the track and turn an event's axis minutes into `left` and `width`.\n */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst calendar = injectCalendarContext('Timeline');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"calendar.title.value\"\n :style=\"{\n '--axis-minutes': calendar.timeline.value.axisMinutes,\n '--window-minutes': calendar.timeline.value.windowMinutes,\n '--slot-minutes': calendar.timeline.value.slotMinutes,\n '--slot-count':\n calendar.timeline.value.axisMinutes / calendar.timeline.value.slotMinutes,\n }\"\n @pointerdown=\"calendar.startSelection\"\n >\n <slot\n :timeline=\"calendar.timeline.value\"\n :days=\"calendar.timeline.value.days\"\n :rows=\"calendar.timeline.value.rows\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceId, TimelineItem } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--event-start`, `--event-end` (axis minutes), and `--event-lane`. */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n item: TimelineItem<any>;\n /** The row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div', resourceId: undefined },\n);\n\nconst calendar = injectCalendarContext('TimelineEvent');\n\n/** Left and right move along the hours; up and down move between resource rows. */\nconst axes = computed(() => ({\n horizontal: 'minutes' as const,\n vertical: 'resource' as const,\n resourceOrder: calendar.timeline.value.rows.map((row) => row.resource?.id ?? null),\n}));\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimelineEvent', () => props.item.event, {\n axes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': item.startOffset,\n '--event-end': item.endOffset,\n '--event-lane': item.lane,\n }\"\n :data-event-id=\"item.event.id\"\n :data-all-day=\"item.event.allDay ? '' : undefined\"\n :data-starts-before=\"item.startsBefore ? '' : undefined\"\n :data-ends-after=\"item.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"item.event\"\n :item=\"item\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ResourceId, TimelineItem } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\nimport { useEventState } from './useEventState.js';\n\n/** Exposes its placement as `--event-start`, `--event-end` (axis minutes), and `--event-lane`. */\nconst props = withDefaults(\n defineProps<\n PrimitiveProps & {\n item: TimelineItem<any>;\n /** The row it's drawn in, so moving it can change resource. */\n resourceId?: ResourceId | null;\n }\n >(),\n { as: 'div', resourceId: undefined },\n);\n\nconst calendar = injectCalendarContext('TimelineEvent');\n\n/** Left and right move along the hours; up and down move between resource rows. */\nconst axes = computed(() => ({\n horizontal: 'minutes' as const,\n vertical: 'resource' as const,\n resourceOrder: calendar.timeline.value.rows.map((row) => row.resource?.id ?? null),\n}));\n\nconst {\n isHighlighted,\n isPast,\n isEditable,\n isDragging,\n highlight,\n unhighlight,\n onPointerdown,\n onKeydown,\n} = useEventState('TimelineEvent', () => props.item.event, {\n axes,\n resourceId: () => props.resourceId,\n});\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :style=\"{\n '--event-start': item.startOffset,\n '--event-end': item.endOffset,\n '--event-lane': item.lane,\n }\"\n :data-event-id=\"item.event.id\"\n :data-all-day=\"item.event.allDay ? '' : undefined\"\n :data-starts-before=\"item.startsBefore ? '' : undefined\"\n :data-ends-after=\"item.endsAfter ? '' : undefined\"\n :data-past=\"isPast ? '' : undefined\"\n :data-highlighted=\"isHighlighted ? '' : undefined\"\n :data-editable=\"isEditable ? '' : undefined\"\n :data-dragging=\"isDragging ? '' : undefined\"\n @pointerenter=\"highlight\"\n @pointerleave=\"unhighlight\"\n @focusin=\"highlight\"\n @focusout=\"unhighlight\"\n @pointerdown=\"onPointerdown\"\n @keydown=\"onKeydown\"\n >\n <slot\n :event=\"item.event\"\n :item=\"item\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only while now falls inside a visible day's window; exposes `--now` in axis minutes. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { now, timeZone, timeline } = injectCalendarContext('TimelineNow');\n\nconst offset = computed(() => {\n const local = now.value.withTimeZone(timeZone.value);\n const day = timeline.value.days.find((candidate) => candidate.date.equals(local.toPlainDate()));\n const minutes = wallMinutes(local) - timeline.value.slotMinMinutes;\n\n if (!day || minutes < 0 || minutes > timeline.value.windowMinutes) {\n return null;\n }\n\n return day.offset + minutes;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"offset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': offset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { wallMinutes } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** Renders only while now falls inside a visible day's window; exposes `--now` in axis minutes. */\nwithDefaults(defineProps<PrimitiveProps>(), { as: 'div' });\n\nconst { now, timeZone, timeline } = injectCalendarContext('TimelineNow');\n\nconst offset = computed(() => {\n const local = now.value.withTimeZone(timeZone.value);\n const day = timeline.value.days.find((candidate) => candidate.date.equals(local.toPlainDate()));\n const minutes = wallMinutes(local) - timeline.value.slotMinMinutes;\n\n if (!day || minutes < 0 || minutes > timeline.value.windowMinutes) {\n return null;\n }\n\n return day.offset + minutes;\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"offset !== null\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--now': offset }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"row.resource ? undefined : 'Unassigned'\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.items.length ? undefined : ''\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :items=\"row.items\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\n\nwithDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), { as: 'div' });\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n role=\"group\"\n :aria-label=\"row.resource ? undefined : 'Unassigned'\"\n :style=\"{ '--row-lanes': Math.max(row.laneCount, 1) }\"\n :data-unassigned=\"row.resource ? undefined : ''\"\n :data-idle=\"row.items.length ? undefined : ''\"\n >\n <slot\n :row=\"row\"\n :resource=\"row.resource\"\n :items=\"row.items\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { daysBetween, type TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out along a row's hours. Renders only in that row; exposes\n * `--selection-start` and `--selection-end` in axis minutes.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeline, resources } = injectCalendarContext('TimelineSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n const rowResource = resources.value ? (props.row.resource?.id ?? null) : undefined;\n\n if (selected?.kind !== 'axis' || selected.resourceId !== rowResource) return null;\n\n const { start, windowMinutes, slotMinMinutes } = timeline.value;\n const toAxis = (date: Temporal.PlainDate, minutes: number) =>\n daysBetween(start, date) * windowMinutes + minutes - slotMinMinutes;\n\n return {\n start: toAxis(selected.startDate, selected.startMinutes!),\n end: toAxis(selected.endDate, selected.endMinutes!),\n };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { daysBetween, type TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/**\n * The range being dragged out along a row's hours. Renders only in that row; exposes\n * `--selection-start` and `--selection-end` in axis minutes.\n */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { selectedRange, timeline, resources } = injectCalendarContext('TimelineSelection');\n\nconst range = computed(() => {\n const selected = selectedRange.value;\n const rowResource = resources.value ? (props.row.resource?.id ?? null) : undefined;\n\n if (selected?.kind !== 'axis' || selected.resourceId !== rowResource) return null;\n\n const { start, windowMinutes, slotMinMinutes } = timeline.value;\n const toAxis = (date: Temporal.PlainDate, minutes: number) =>\n daysBetween(start, date) * windowMinutes + minutes - slotMinMinutes;\n\n return {\n start: toAxis(selected.startDate, selected.startMinutes!),\n end: toAxis(selected.endDate, selected.endMinutes!),\n };\n});\n</script>\n\n<template>\n <Primitive\n v-if=\"range\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-hidden=\"true\"\n :style=\"{ '--selection-start': range.start, '--selection-end': range.end }\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's time axis: events, selections, and drops are measured against its width. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { timeline, resources } = injectCalendarContext('TimelineTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"axis\"\n :data-axis-minutes=\"timeline.axisMinutes\"\n :data-resource-id=\"resources ? String(props.row.resource?.id ?? '') : undefined\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport type { TimelineRow } from '@calends/core';\nimport { Primitive, type PrimitiveProps } from 'reka-ui';\nimport { injectCalendarContext } from './useCalendar.js';\n\n/** A row's time axis: events, selections, and drops are measured against its width. */\nconst props = withDefaults(defineProps<PrimitiveProps & { row: TimelineRow<any, any> }>(), {\n as: 'div',\n});\n\nconst { timeline, resources } = injectCalendarContext('TimelineTrack');\n</script>\n\n<template>\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n data-drop=\"axis\"\n :data-axis-minutes=\"timeline.axisMinutes\"\n :data-resource-id=\"resources ? String(props.row.resource?.id ?? '') : undefined\"\n >\n <slot />\n </Primitive>\n</template>\n"],"mappings":"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"}
|