@reservi/preact 1.6.0 → 1.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/render/slots.tsx","../src/interaction/responsive.ts","../src/components/Toolbar.tsx","../src/render/format.ts","../src/render/nav.ts","../src/interaction/keyboard.ts","../src/interaction/daygrid-drag.ts","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind-all.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/index.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/honey-pot-data-attribute.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/is-honey-pot-element.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/get-element-from-point-without-honey-pot.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/max-z-index.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/popover-reset-styles.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/once.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/supports-popover.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/make-honey-pot-fix.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-firefox.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-from-another-window.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/count-events-for-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-leaving-window-in-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-leaving-window.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/detect-broken-drag.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/get-input.js","../../../node_modules/.pnpm/raf-schd@4.0.3/node_modules/raf-schd/dist/raf-schd.esm.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/dispatch-consumer-event.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/lifecycle-manager.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/usage-ledger.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/combine.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/add-attribute.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-drop-target.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-monitor.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-adapter.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/android.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/media-types/text-media-type.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/media-types/url-media-type.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter-native-data-key.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/element/custom-native-drag-preview/preserve-offset-on-source.js","../src/interaction/pdnd-timegrid.ts","../src/interaction/pdnd-daygrid.ts","../src/views/daygrid/DayGridView.tsx","../src/interaction/auto-scroll.ts","../src/interaction/drag.ts","../src/views/timegrid/TimeGridView.tsx","../src/views/list/ListView.tsx","../src/views/multimonth/MultiMonthView.tsx","../src/views/timeline/TimelineView.tsx","../src/views/resource/ResourceTimelineView.tsx","../src/views/resource/ResourceTimeGridView.tsx","../src/views/resource/ResourceDayGridView.tsx","../src/views/resource/ResourceDayGridMonthView.tsx","../src/components/Calendar.tsx","../src/mount.ts","../src/ical.ts"],"sourcesContent":["import type { CalendarOptions, EventDef } from \"@reservi/core\";\nimport type { ComponentChildren } from \"preact\";\n\n/** Vista activa tal como la reciben los slots y los hooks `*DidMount`. */\nexport interface ViewArg {\n readonly type: string;\n}\n\n/** Argumento del slot del botón \"+N more\" (popover de eventos ocultos). */\nexport interface MoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: EventDef[];\n hiddenEvents: EventDef[];\n view: ViewArg;\n}\n\n/** Argumento del slot de contenido de evento. */\nexport interface EventContentArg {\n event: EventDef;\n isAllDay: boolean;\n /** Texto de hora ya formateado (vacío si allDay). */\n timeText: string;\n view: ViewArg;\n}\n\n/** Argumento del slot de celda de día. */\nexport interface DayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: ViewArg;\n}\n\n/** Argumento del slot de cabecera de día (nombre del día de la semana). */\nexport interface DayHeaderContentArg {\n date: Date;\n text: string;\n /** Día de la semana, 0 = domingo … 6 = sábado. */\n dayOfWeek: number;\n /** Día del mes (1–31). */\n dayNumber: number;\n isToday: boolean;\n view: ViewArg;\n}\n\n/** Argumento del slot de etiqueta del eje horario (timeGrid). */\nexport interface SlotLabelContentArg {\n /** Texto ya formateado (p. ej. \"09:00\"). */\n text: string;\n /** Minutos desde medianoche del slot. */\n minutes: number;\n /** Si es una marca mayor (etiquetada). */\n isMajor: boolean;\n view: ViewArg;\n}\n\n/**\n * Marcador que puede devolver un slot cuando el contenido lo pinta el\n * framework anfitrión (React, Vue…). La capa Preact NO interpreta `node`:\n * solo reserva un hueco en el DOM y delega en el `hostBridge`.\n */\nexport interface HostSlotResult {\n readonly __rsvHost: true;\n /** Nodo del framework anfitrión (opaco para esta capa). */\n readonly node: unknown;\n}\n\n/** Crea el marcador de contenido delegado al framework anfitrión. */\nexport function hostSlot(node: unknown): HostSlotResult {\n return { __rsvHost: true, node };\n}\n\n/** ¿El resultado de un slot delega el render en el anfitrión? */\nexport function isHostSlot(value: unknown): value is HostSlotResult {\n return typeof value === \"object\" && value !== null && (value as HostSlotResult).__rsvHost === true;\n}\n\n/**\n * Puente para pintar contenido del framework anfitrión dentro del árbol de\n * Preact. Lo implementan los wrappers (p. ej. `@reservi/react` con portales).\n */\nexport interface HostBridge {\n /** Un hueco ha entrado en el DOM: pinta `node` dentro de `el`. */\n mount(id: string, el: HTMLElement, node: unknown): void;\n /** El contenido del hueco `id` ha cambiado. */\n update(id: string, node: unknown): void;\n /** El hueco `id` ha salido del DOM: libera lo que se pintó en él. */\n unmount(id: string): void;\n}\n\nexport type SlotResult = ComponentChildren | string | HostSlotResult;\n\n/**\n * Slots de render (patrón de \"content\" de FullCalendar). Cada slot devuelve\n * contenido Preact, una cadena, o `hostSlot(...)` para delegar en el anfitrión.\n */\nexport interface ReserviSlots {\n eventContent?: (arg: EventContentArg) => SlotResult;\n dayCellContent?: (arg: DayCellContentArg) => SlotResult;\n dayHeaderContent?: (arg: DayHeaderContentArg) => SlotResult;\n /** Personaliza la etiqueta del eje horario (timeGrid). */\n slotLabelContent?: (arg: SlotLabelContentArg) => SlotResult;\n /**\n * Personaliza el contenido del botón \"+N more\" (dayGrid/multiMonth). El\n * `<button>` que abre el popover se conserva; el slot solo reemplaza su\n * contenido interno (mismo patrón que `dayCellContent`).\n */\n moreLinkContent?: (arg: MoreLinkContentArg) => SlotResult;\n /**\n * Contenido libre al inicio de la toolbar (zona \"Filtrar/Personal\" del diseño).\n * El usuario decide qué botones poner y qué hacen; si no se define, no se\n * renderiza nada en esa zona.\n */\n toolbarStart?: () => SlotResult;\n /**\n * Contenido libre al final de la toolbar, antes del botón \"Añadir\".\n * Útil para acciones extra propias del anfitrión.\n */\n toolbarEnd?: () => SlotResult;\n}\n\n/**\n * Hooks de ciclo de vida sobre el DOM ya montado (equivalentes a los\n * `*DidMount` de FullCalendar). Se invocan UNA vez por elemento del DOM.\n */\nexport interface ReserviHooks {\n eventDidMount?: (arg: EventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: DayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: DayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: SlotLabelContentArg & { el: HTMLElement }) => void;\n}\n\n/** Clases por slot, fusionadas con las base. */\nexport interface ReserviClassNames {\n root?: string;\n toolbar?: string;\n /** Celda de día (dayGrid/multiMonth). */\n day?: string;\n event?: string;\n /** Cabecera de día (nombre del día / columna). */\n dayHeader?: string;\n /** Etiqueta del eje horario (timeGrid). */\n slotLabel?: string;\n}\n\n/** Opciones de la capa Preact = opciones de núcleo + presentación. */\nexport interface ReserviCalendarOptions extends CalendarOptions {\n slots?: ReserviSlots;\n hooks?: ReserviHooks;\n classNames?: ReserviClassNames;\n /**\n * Puente de render del framework anfitrión. Lo inyecta el wrapper; no es\n * necesario configurarlo a mano en uso vanilla/Preact.\n */\n hostBridge?: HostBridge;\n /**\n * Vistas a mostrar como pestañas en la segunda fila de la toolbar\n * (p. ej. [\"dayGridMonth\", \"timeGridWeek\", \"listWeek\"]). Si se omite, se\n * derivan de los tokens de `headerToolbar`; si tampoco hay, no se muestra la fila.\n */\n views?: string[];\n /**\n * Callback del botón \"Añadir\". Solo si se define se renderiza el botón; el\n * anfitrión decide qué ocurre al pulsarlo (abrir un modal, navegar, etc.).\n */\n onAddClick?: () => void;\n /** Texto del botón \"Añadir\" (def. \"+\" sin etiqueta). */\n addButtonText?: string;\n /**\n * Cambia de vista automáticamente al redimensionar el contenedor (p. ej.\n * mes → lista en mobile). Se evalúa el `breakpoint` más alto que sea\n * `<= ancho actual` (estilo media query `min-width`).\n */\n responsiveViews?: { breakpoint: number; view: string }[];\n}\n","import type { ComponentChildren, VNode } from \"preact\";\nimport { useLayoutEffect, useRef } from \"preact/hooks\";\nimport { isHostSlot, type HostBridge, type SlotResult } from \"../types.js\";\n\n/**\n * Resuelve un slot de contenido: si el usuario aportó una función, usa su\n * resultado; si no, usa el contenido por defecto. Unifica el contrato de los\n * render hooks para todos los frameworks (en wrappers se adapta a su idioma).\n *\n * Si el slot devuelve `hostSlot(node)`, se reserva un hueco en el DOM y el\n * `bridge` del framework anfitrión pinta el contenido dentro (React usa\n * portales). Sin bridge se cae al contenido por defecto.\n */\nexport function renderSlot<Arg>(\n slot: ((arg: Arg) => SlotResult) | undefined,\n arg: Arg,\n fallback: ComponentChildren,\n bridge?: HostBridge | undefined,\n): ComponentChildren {\n if (!slot) return fallback;\n const result = slot(arg);\n // Como en FullCalendar, `undefined` significa \"usa el contenido por defecto\"\n // (los wrappers lo devuelven cuando el anfitrion no aporta ese render prop).\n if (result === undefined) return fallback;\n if (isHostSlot(result)) {\n if (!bridge) return fallback;\n return <HostSlotOutlet bridge={bridge} node={result.node} />;\n }\n return result as ComponentChildren;\n}\n\nlet hostSeq = 0;\n\n/**\n * Hueco en el DOM cuyo contenido pinta el framework anfitrión. Se identifica\n * por posición (un id por instancia montada), así que eventos repetidos en\n * varias celdas o en el popover no colisionan.\n */\nfunction HostSlotOutlet({ bridge, node }: { bridge: HostBridge; node: unknown }): VNode {\n const idRef = useRef(\"\");\n if (!idRef.current) idRef.current = `rsv-host-${++hostSeq}`;\n const elRef = useRef<HTMLDivElement>(null);\n const nodeRef = useRef(node);\n nodeRef.current = node;\n const liveRef = useRef(false);\n\n // useLayoutEffect y no useEffect: el hueco debe registrarse en el mismo\n // commit en que entra en el DOM, para que el anfitrion pinte su contenido sin\n // un frame intermedio en blanco.\n useLayoutEffect(() => {\n const el = elRef.current;\n if (!el) return;\n const id = idRef.current;\n liveRef.current = true;\n bridge.mount(id, el, nodeRef.current);\n return () => {\n liveRef.current = false;\n bridge.unmount(id);\n };\n // El hueco se monta una sola vez; los cambios de contenido van por `update`.\n }, []);\n\n // Sin deps a proposito: el nodo del anfitrion es un objeto nuevo en cada\n // render, asi que se reenvia siempre y el bridge decide si hay cambio real.\n useLayoutEffect(() => {\n if (liveRef.current) bridge.update(idRef.current, node);\n });\n\n return <div data-rsv=\"host\" ref={elRef} />;\n}\n\n/** Une clases base con las del usuario (filtra vacíos). */\nexport function cx(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/**\n * Invoca un hook `*DidMount` una única vez por elemento del DOM. Preact vuelve\n * a llamar a los callback refs en cada render, así que hace falta recordar qué\n * elementos ya se notificaron (FullCalendar tampoco re-dispara `*DidMount`).\n */\nconst notified = new WeakSet<HTMLElement>();\n\nexport function callDidMount<Arg extends { el: HTMLElement }>(\n el: Element | null,\n hook: ((arg: Arg) => void) | undefined,\n buildArg: () => Omit<Arg, \"el\">,\n): void {\n if (!el || !hook) return;\n const html = el as HTMLElement;\n if (notified.has(html)) return;\n notified.add(html);\n hook(Object.assign(buildArg(), { el: html }) as Arg);\n}\n","/** Entrada de `responsiveViews`: a partir de `breakpoint` px de ancho, usa `view`. */\nexport interface ResponsiveViewEntry {\n breakpoint: number;\n view: string;\n}\n\n/**\n * Resuelve qué vista corresponde a un ancho dado: el `breakpoint` más alto que\n * sea `<= width` (estilo media query `min-width`). Si `width` es menor que\n * todos los breakpoints, usa la vista del breakpoint más bajo (piso \"mobile\").\n */\nexport function pickResponsiveView(entries: ResponsiveViewEntry[], width: number): string | null {\n if (!entries.length) return null;\n const sorted = [...entries].sort((a, b) => a.breakpoint - b.breakpoint);\n let chosen = sorted[0]!.view;\n for (const entry of sorted) {\n if (width >= entry.breakpoint) chosen = entry.view;\n }\n return chosen;\n}\n","import { dl, getLocaleText, type CalendarApi } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions } from \"../types.js\";\nimport { cx } from \"../render/slots.js\";\n\nconst NAV_SYMBOLS = { prev: \"‹\", next: \"›\" } as const;\n/** Tokens que NO son vistas (no aparecen como pestañas). */\nconst NON_VIEW_TOKENS = new Set([\"\", \"title\", \"today\", \"prev\", \"next\"]);\n/** Vistas cuyo datepicker elige MES (resto: elige DÍA). */\nconst MONTH_VIEW_RE = /month|year/i;\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\n/** Icono de calendario junto al título. */\nfunction CalendarIcon(): VNode {\n return (\n <svg\n data-rsv=\"title-icon\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"1\" y=\"2.5\" width=\"12\" height=\"10.5\" rx=\"1.5\" />\n <line x1=\"1\" y1=\"5.5\" x2=\"13\" y2=\"5.5\" />\n <line x1=\"4.5\" y1=\"1\" x2=\"4.5\" y2=\"3.5\" />\n <line x1=\"9.5\" y1=\"1\" x2=\"9.5\" y2=\"3.5\" />\n </svg>\n );\n}\n\ninterface ToolbarProps {\n api: CalendarApi;\n title: string;\n activeView: string;\n options: ReserviCalendarOptions;\n}\n\n/** Vistas para la fila de pestañas: prop `views` o, en su defecto, tokens de `headerToolbar`. */\nfunction resolveViews(options: ReserviCalendarOptions): string[] {\n if (options.views?.length) return options.views;\n const tb = options.headerToolbar;\n if (!tb) return [];\n return [tb.start, tb.center, tb.end]\n .filter((s): s is string => Boolean(s))\n .flatMap((s) => s.split(/\\s+/))\n .flatMap((g) => g.split(\",\"))\n .filter((t) => !NON_VIEW_TOKENS.has(t));\n}\n\n/**\n * Toolbar de dos filas:\n * - Fila 1: slot de inicio (Filtrar/Personal del anfitrión) · navegación\n * (hoy ‹ título ›) · slot de fin + botón \"Añadir\" (opcional, vía props).\n * - Fila 2: pestañas de vista.\n *\n * El título abre un datepicker para saltar de fecha. En vistas de mes/año la\n * rejilla elige MES; en el resto (semana/día/lista) elige DÍA. Se abre también\n * con Ctrl+M y se cierra con Esc o clic fuera.\n */\nexport function Toolbar({ api, title, activeView, options }: ToolbarProps): VNode {\n const text = getLocaleText(options.locale);\n const startSlot = options.slots?.toolbarStart?.();\n const endSlot = options.slots?.toolbarEnd?.();\n const views = resolveViews(options);\n const monthMode = MONTH_VIEW_RE.test(activeView);\n const firstDay = options.firstDay ?? text.firstDay;\n\n const wrapRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n\n // Fecha seleccionada (para resaltar). Reactivo vía signals.\n const selected = dl.toDate(api.getDate());\n const nowRef = dl.toDate(options.now ? dl.from(options.now) : dl.now());\n\n // El mes/año mostrados en la rejilla (independientes de la navegación principal).\n const [viewYear, setViewYear] = useState(selected.getFullYear());\n const [viewMonth, setViewMonth] = useState(selected.getMonth());\n\n const monthShortFmt = new Intl.DateTimeFormat(options.locale, { month: \"short\" });\n const monthLongFmt = new Intl.DateTimeFormat(options.locale, { month: \"long\" });\n const dowFmt = new Intl.DateTimeFormat(options.locale, { weekday: \"short\" });\n const monthNames = Array.from({ length: 12 }, (_, i) =>\n monthShortFmt.format(new Date(2020, i, 1)),\n );\n\n const openPicker = (): void => {\n const d = dl.toDate(api.getDate());\n setViewYear(d.getFullYear());\n setViewMonth(d.getMonth());\n setOpen(true);\n };\n const shiftMonth = (delta: number): void => {\n const total = viewYear * 12 + viewMonth + delta;\n setViewYear(Math.floor(total / 12));\n setViewMonth(((total % 12) + 12) % 12);\n };\n const goto = (iso: string): void => {\n api.gotoDate(iso);\n setOpen(false);\n };\n\n // Ctrl+M abre · Esc cierra · clic fuera cierra.\n useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && (e.key === \"m\" || e.key === \"M\")) {\n e.preventDefault();\n openPicker();\n } else if (e.key === \"Escape\") {\n setOpen(false);\n }\n };\n const onPointer = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onPointer);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onPointer);\n };\n }, []);\n\n // Celdas (6×7) para el modo DÍA, alineadas a firstDay.\n const dayGrid = ((): { cells: Date[]; dows: string[] } => {\n if (monthMode) return { cells: [], dows: [] };\n const first = dl.from(`${viewYear}-${pad2(viewMonth + 1)}-01`);\n const offset = (dl.dayOfWeek(first) - firstDay + 7) % 7;\n const start = dl.subtract(first, { days: offset });\n const cells = Array.from({ length: 42 }, (_, i) => dl.toDate(dl.add(start, { days: i })));\n const dows = cells.slice(0, 7).map((d) => dowFmt.format(d));\n return { cells, dows };\n })();\n\n return (\n <div data-rsv=\"toolbar-wrap\" class={cx(options.classNames?.toolbar)} ref={wrapRef}>\n <div data-rsv=\"toolbar\">\n {/* Inicio: slot libre del anfitrión (Filtrar / Personal …) */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"start\">\n {startSlot}\n </div>\n\n {/* Navegación: hoy · ‹ título › */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"nav\">\n <button\n type=\"button\"\n data-rsv=\"button\"\n title={text.todayHint}\n aria-label={text.todayHint}\n onClick={() => api.today()}\n >\n {text.today}\n </button>\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-nav=\"prev\"\n title={text.prevHint}\n aria-label={text.prevHint}\n onClick={() => api.prev()}\n >\n {NAV_SYMBOLS.prev}\n </button>\n\n {/* Título = disparador del datepicker */}\n <div data-rsv=\"datepicker-anchor\">\n <button\n type=\"button\"\n data-rsv=\"title\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={`${title} · Ctrl+M`}\n onClick={() => (open ? setOpen(false) : openPicker())}\n >\n <CalendarIcon />\n {title}\n </button>\n\n {open && (\n <div\n data-rsv=\"datepicker\"\n data-rsv-mode={monthMode ? \"month\" : \"day\"}\n role=\"dialog\"\n aria-label={title}\n >\n <div data-rsv=\"dp-head\">\n <button\n type=\"button\"\n data-rsv=\"dp-nav\"\n aria-label={text.prev}\n onClick={() => (monthMode ? setViewYear((y) => y - 1) : shiftMonth(-1))}\n >\n {NAV_SYMBOLS.prev}\n </button>\n <span data-rsv=\"dp-label\">\n {monthMode\n ? viewYear\n : `${monthLongFmt.format(new Date(viewYear, viewMonth, 1))} ${viewYear}`}\n </span>\n <button\n type=\"button\"\n data-rsv=\"dp-nav\"\n aria-label={text.next}\n onClick={() => (monthMode ? setViewYear((y) => y + 1) : shiftMonth(1))}\n >\n {NAV_SYMBOLS.next}\n </button>\n </div>\n\n {monthMode ? (\n <div data-rsv=\"dp-grid\">\n {monthNames.map((label, i) => (\n <button\n type=\"button\"\n data-rsv=\"dp-month\"\n key={label}\n data-active={String(\n viewYear === selected.getFullYear() && i === selected.getMonth(),\n )}\n data-today={String(\n viewYear === nowRef.getFullYear() && i === nowRef.getMonth(),\n )}\n onClick={() => goto(`${viewYear}-${pad2(i + 1)}-01`)}\n >\n {label}\n </button>\n ))}\n </div>\n ) : (\n <div data-rsv=\"dp-days\">\n {dayGrid.dows.map((d, i) => (\n <div data-rsv=\"dp-dow\" key={`dow-${i}`}>\n {d}\n </div>\n ))}\n {dayGrid.cells.map((d) => {\n const iso = `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n return (\n <button\n type=\"button\"\n data-rsv=\"dp-day\"\n key={iso}\n data-other={String(d.getMonth() !== viewMonth)}\n data-active={String(\n d.getFullYear() === selected.getFullYear() &&\n d.getMonth() === selected.getMonth() &&\n d.getDate() === selected.getDate(),\n )}\n data-today={String(\n d.getFullYear() === nowRef.getFullYear() &&\n d.getMonth() === nowRef.getMonth() &&\n d.getDate() === nowRef.getDate(),\n )}\n onClick={() => goto(iso)}\n >\n {d.getDate()}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-nav=\"next\"\n title={text.nextHint}\n aria-label={text.nextHint}\n onClick={() => api.next()}\n >\n {NAV_SYMBOLS.next}\n </button>\n </div>\n\n {/* Fin: slot libre + botón \"Añadir\" (solo si se pasa onAddClick) */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"end\">\n {endSlot}\n {options.onAddClick && (\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-variant=\"primary\"\n onClick={options.onAddClick}\n >\n <span data-rsv=\"add-icon\" aria-hidden=\"true\">\n +\n </span>\n {options.addButtonText}\n </button>\n )}\n </div>\n </div>\n\n {/* Fila 2: pestañas de vista */}\n {views.length > 0 && (\n <div data-rsv=\"toolbar-views\" role=\"tablist\">\n {views.map((v) => (\n <button\n type=\"button\"\n data-rsv=\"view-tab\"\n key={v}\n role=\"tab\"\n aria-selected={v === activeView}\n data-active={String(v === activeView)}\n title={text.viewHint(text.views[v] ?? v)}\n onClick={() => api.changeView(v)}\n >\n {text.views[v] ?? v}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Formateadores de hora compartidos por las vistas. Por defecto Reservi usa\n * 24h (\"HH:mm\"); si el usuario aporta opciones de `Intl.DateTimeFormat`\n * (`eventTimeFormat` / `slotLabelFormat`), manda su formato.\n */\n\n/** Rellena a dos dígitos. */\nexport function pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n/** \"HH:mm\" a partir de minutos desde medianoche. */\nexport function minutesToLabel(minutes: number): string {\n const total = ((Math.round(minutes) % 1440) + 1440) % 1440;\n return `${pad2(Math.floor(total / 60))}:${pad2(total % 60)}`;\n}\n\n/** \"HH:mm:ss\" a partir de minutos desde medianoche (sin envolver a 24h). */\nexport function minutesToTimeString(minutes: number): string {\n const m = Math.max(0, Math.round(minutes));\n return `${pad2(Math.floor(m / 60))}:${pad2(m % 60)}:00`;\n}\n\n/**\n * Formateador de hora: usa `Intl` si hay opciones, y si no el 24h por defecto\n * que ya produce el núcleo. Devuelve null si no hay que sobreescribir nada.\n */\nexport function timeFormatter(\n locale: string,\n options: Intl.DateTimeFormatOptions | undefined,\n): ((date: Date) => string) | null {\n if (!options) return null;\n const fmt = new Intl.DateTimeFormat(locale, options);\n return (date: Date) => fmt.format(date);\n}\n\n/** Formateador de fecha para cabeceras; `false` significa \"sin texto\". */\nexport function dateFormatter(\n locale: string,\n options: Intl.DateTimeFormatOptions | false | undefined,\n fallback: Intl.DateTimeFormatOptions,\n): ((date: Date) => string) | null {\n if (options === false) return null;\n const fmt = new Intl.DateTimeFormat(locale, options ?? fallback);\n return (date: Date) => fmt.format(date);\n}\n","import { dl, type CalendarApi, type RsvDate } from \"@reservi/core\";\n\n/**\n * Navegación de \"nav links\": dispara `navLinkDay` y, por defecto, va a la vista\n * de día (timeGridDay o dayGridDay, la que esté registrada) en esa fecha.\n */\nexport function navLinkToDay(api: CalendarApi, date: RsvDate): void {\n api.trigger(\"navLinkDay\", { date });\n const target = api.hasView(\"timeGridDay\")\n ? \"timeGridDay\"\n : api.hasView(\"dayGridDay\")\n ? \"dayGridDay\"\n : null;\n if (target) {\n api.gotoDate(dl.toISOString(date));\n api.changeView(target);\n }\n}\n","/**\n * Movimiento de eventos por teclado (accesibilidad WCAG). No necesita geometría\n * de píxeles: mueve por incrementos fijos (días o snap de minutos), por lo que\n * es plenamente testeable. Usa moveEvent (validado) del núcleo.\n */\nimport {\n computeDrop,\n dl,\n timeStringToMinutes,\n type CalendarApi,\n type EventDef,\n type KeyboardAction,\n} from \"@reservi/core\";\n\nexport type GridKind = \"dayGrid\" | \"timeGrid\";\n\nconst DAY = 1440;\n\n/** Atajos por defecto (usados para cualquier acción sin override del usuario). */\nconst DEFAULT_SHORTCUTS: Record<KeyboardAction, string[]> = {\n moveLeft: [\"ArrowLeft\"],\n moveRight: [\"ArrowRight\"],\n moveUp: [\"ArrowUp\"],\n moveDown: [\"ArrowDown\"],\n activate: [\"Enter\", \" \"],\n};\n\ninterface KeydownOptions {\n api: CalendarApi;\n event: EventDef;\n kind: GridKind;\n snap?: string | undefined;\n /** Override de atajos (se mergea sobre `DEFAULT_SHORTCUTS` por acción). */\n shortcuts?: Partial<Record<KeyboardAction, string[]>> | undefined;\n}\n\n/** Resuelve qué acción corresponde a la tecla pulsada, según el mapa efectivo. */\nfunction resolveAction(\n key: string,\n shortcuts: Partial<Record<KeyboardAction, string[]>> | undefined,\n): KeyboardAction | null {\n const entries = Object.entries(DEFAULT_SHORTCUTS) as [KeyboardAction, string[]][];\n for (const [action, defaultKeys] of entries) {\n const keys = shortcuts?.[action] ?? defaultKeys;\n if (keys.includes(key)) return action;\n }\n return null;\n}\n\nexport function handleEventKeydown(e: KeyboardEvent, opts: KeydownOptions): void {\n const { api, event, kind } = opts;\n const snapMin = timeStringToMinutes(opts.snap ?? \"00:30\");\n const action = resolveAction(e.key, opts.shortcuts);\n if (!action) return; // tecla no gestionada\n\n if (action === \"activate\") {\n e.preventDefault();\n api.trigger(\"eventClick\", { event });\n return;\n }\n\n let deltaMin = 0;\n switch (action) {\n case \"moveLeft\":\n deltaMin = -DAY;\n break;\n case \"moveRight\":\n deltaMin = DAY;\n break;\n case \"moveUp\":\n deltaMin = kind === \"timeGrid\" ? -snapMin : -DAY * 7;\n break;\n case \"moveDown\":\n deltaMin = kind === \"timeGrid\" ? snapMin : DAY * 7;\n break;\n }\n\n e.preventDefault();\n const next = computeDrop(event.start, event.end, deltaMin, dl);\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(\"eventDrop\", { event: updated });\n }\n}\n","/**\n * Drag por puntero para dayGrid/mes: mover un evento entre días y seleccionar\n * un rango de días arrastrando. El cálculo de fechas usa el núcleo (computeDrop\n * + dl); aquí solo se hace hit-testing del DOM para saber sobre qué día se está.\n */\nimport { computeDrop, dl, type CalendarApi, type EventDef } from \"@reservi/core\";\n\nconst DAY = 1440;\nconst THRESHOLD = 4;\n\n/** Fecha (ISO) de la celda de día bajo el punto, o null. */\nfunction dateAtPoint(x: number, y: number): string | null {\n const el = document.elementFromPoint(x, y) as HTMLElement | null;\n return el?.closest<HTMLElement>('[data-rsv=\"day\"]')?.dataset.date ?? null;\n}\n\ninterface EventDragOptions {\n api: CalendarApi;\n event: EventDef;\n /** Fecha (ISO) de la celda donde empezó el arrastre. */\n sourceDate: string;\n /** Se llama si hubo arrastre real (para suprimir el click posterior). */\n onMoved?: () => void;\n}\n\n/** Arrastra un evento entre días (dayGrid/mes). */\nexport function startDayGridEventDrag(ev: PointerEvent, opts: EventDragOptions): void {\n ev.stopPropagation();\n const { api, event, sourceDate } = opts;\n const startX = ev.clientX;\n const startY = ev.clientY;\n let dragging = false;\n\n const onMove = (e: PointerEvent): void => {\n if (!dragging && Math.hypot(e.clientX - startX, e.clientY - startY) > THRESHOLD) {\n dragging = true;\n document.body.style.cursor = \"grabbing\";\n }\n };\n const onUp = (e: PointerEvent): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n document.body.style.cursor = \"\";\n if (!dragging) return;\n opts.onMoved?.();\n const target = dateAtPoint(e.clientX, e.clientY);\n if (!target) return;\n const deltaDays = dl.diff(dl.from(sourceDate), dl.from(target), \"day\");\n if (deltaDays === 0) return;\n const next = computeDrop(event.start, event.end, deltaDays * DAY, dl);\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(\"eventDrop\", { event: updated });\n }\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n\n/**\n * Selecciona un rango de días arrastrando. Solo actúa si hay arrastre real\n * (varios días); un click simple lo gestiona el `onClick` de la celda. Llama a\n * `onRangeSelect` cuando selecciona, para suprimir el click posterior.\n */\nexport function startDayRangeSelect(\n ev: PointerEvent,\n opts: { api: CalendarApi; startDate: string; onRangeSelect?: () => void },\n): void {\n const target = ev.target as HTMLElement;\n // No iniciar selección si se pulsa sobre un evento, el \"+N more\" o un nav-link.\n if (target.closest('[data-rsv=\"event\"], [data-rsv=\"more-anchor\"], [data-nav-link=\"true\"]')) {\n return;\n }\n const { api } = opts;\n let endStr = opts.startDate;\n let moved = false;\n\n const onMove = (e: PointerEvent): void => {\n const d = dateAtPoint(e.clientX, e.clientY);\n if (d && d !== opts.startDate) moved = true;\n if (d) endStr = d;\n };\n const onUp = (): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n if (!moved) return; // click simple → lo gestiona onClick\n opts.onRangeSelect?.();\n const a = dl.from(opts.startDate);\n const b = dl.from(endStr);\n const [lo, hi] = dl.isBefore(a, b) ? [a, b] : [b, a];\n // Fin exclusivo (+1 día), como FullCalendar.\n api.select(dl.toISOString(lo), dl.toISOString(dl.add(hi, { days: 1 })));\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nexport { _iterableToArrayLimit as default };","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bind = void 0;\nfunction bind(target, _a) {\n var type = _a.type, listener = _a.listener, options = _a.options;\n target.addEventListener(type, listener, options);\n return function unbind() {\n target.removeEventListener(type, listener, options);\n };\n}\nexports.bind = bind;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = void 0;\nvar bind_1 = require(\"./bind\");\nfunction toOptions(value) {\n if (typeof value === 'undefined') {\n return undefined;\n }\n if (typeof value === 'boolean') {\n return {\n capture: value,\n };\n }\n return value;\n}\nfunction getBinding(original, sharedOptions) {\n if (sharedOptions == null) {\n return original;\n }\n var binding = __assign(__assign({}, original), { options: __assign(__assign({}, toOptions(sharedOptions)), toOptions(original.options)) });\n return binding;\n}\nfunction bindAll(target, bindings, sharedOptions) {\n var unbinds = bindings.map(function (original) {\n var binding = getBinding(original, sharedOptions);\n return (0, bind_1.bind)(target, binding);\n });\n return function unbindAll() {\n unbinds.forEach(function (unbind) { return unbind(); });\n };\n}\nexports.bindAll = bindAll;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = exports.bind = void 0;\nvar bind_1 = require(\"./bind\");\nObject.defineProperty(exports, \"bind\", { enumerable: true, get: function () { return bind_1.bind; } });\nvar bind_all_1 = require(\"./bind-all\");\nObject.defineProperty(exports, \"bindAll\", { enumerable: true, get: function () { return bind_all_1.bindAll; } });\n","// pulling this into a separate file so adapter(s) that don't\n// need the honey pot can pay as little as possible for it.\nexport var honeyPotDataAttribute = 'data-pdnd-honey-pot';","import { honeyPotDataAttribute } from './honey-pot-data-attribute';\nexport function isHoneyPotElement(target) {\n return target instanceof Element && target.hasAttribute(honeyPotDataAttribute);\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { isHoneyPotElement } from './is-honey-pot-element';\nexport function getElementFromPointWithoutHoneypot(client) {\n // eslint-disable-next-line no-restricted-syntax\n var _document$elementsFro = document.elementsFromPoint(client.x, client.y),\n _document$elementsFro2 = _slicedToArray(_document$elementsFro, 2),\n top = _document$elementsFro2[0],\n second = _document$elementsFro2[1];\n if (!top) {\n return null;\n }\n if (isHoneyPotElement(top)) {\n return second !== null && second !== void 0 ? second : null;\n }\n return top;\n}","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","// Maximum possible z-index\n// https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index\nexport var maxZIndex = 2147483647;","/**\n * Resets user agent styles for `[popover]` elements.\n *\n * Browsers apply these defaults to popovers (per the WHATWG HTML spec rendering section):\n * - `inset: 0` + `margin: auto` → centers the popover in the viewport\n * - `border: solid` → visible border\n * - `padding: 0.25em` → internal spacing\n * - `overflow: auto` → scrollbars when content overflows\n * - `color: CanvasText` + `background-color: Canvas` → system theme colors\n *\n * This object neutralizes those defaults so the popover behaves like a plain\n * positioned `<div>`, matching the sizing of the legacy (non-popover)\n * fallback container exactly.\n *\n * **Width and height (`auto`)**\n *\n * `width` and `height` override the spec user agent value of `fit-content`\n * with `auto`.\n *\n * _Why?_\n *\n * - When a `[popover]` is sized with `fit-content` and contains a flex\n * container, Safari collapses any flex item that uses `overflow: auto`\n * to `0px`.\n * - Setting the popover's `width` and `height` to `auto` skips the `fit-content`\n * pass and avoids the bug in Safari\n * - Chromium and Firefox tolerate `fit-content` here, but `auto` is safe\n * everywhere and matches our non-popover path\n */\nexport var popoverResetUserAgentStyles = {\n inset: 'unset',\n border: 'none',\n padding: 0,\n margin: 0,\n overflow: 'visible',\n color: 'inherit',\n background: 'transparent',\n width: 'auto',\n height: 'auto'\n};","/** Provide a function that you only ever want to be called a single time */\nexport function once(fn) {\n var cache = null;\n return function wrapped() {\n if (!cache) {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var result = fn.apply(this, args);\n cache = {\n result: result\n };\n }\n return cache.result;\n };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\n/**\n * Returns `true` if the browser supports the Popover API (top-layer).\n *\n * When supported, elements with `popover=\"manual\"` can be promoted to the\n * browser's top layer via `element.showPopover()`, which is more reliable\n * than `z-index` for ensuring an element renders above everything else.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API\n */\nexport var supportsPopover = once(function supportsPopover() {\n return typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.showPopover === 'function';\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { bind, bindAll } from 'bind-event-listener';\nimport { maxZIndex } from '../util/max-z-index';\nimport { popoverResetUserAgentStyles } from '../util/popover-reset-styles';\nimport { supportsPopover } from '../util/supports-popover';\nimport { honeyPotDataAttribute } from './honey-pot-data-attribute';\nvar honeyPotSize = 2;\nvar halfHoneyPotSize = honeyPotSize / 2;\n\n/**\n * `clientX` and `clientY` can be in sub pixels (eg `2.332`)\n * However, browser hitbox testing is commonly do to the closest pixel.\n *\n * → https://issues.chromium.org/issues/40940531\n *\n * To be sure that the honey pot will be over the `client` position,\n * we `.floor()` `clientX` and`clientY` and then make it `2px` in size.\n **/\nfunction floorToClosestPixel(point) {\n return {\n x: Math.floor(point.x),\n y: Math.floor(point.y)\n };\n}\n\n/**\n * We want to make sure the honey pot sits around the users position.\n * This seemed to be the most resilient while testing.\n */\nfunction pullBackByHalfHoneyPotSize(point) {\n return {\n x: point.x - halfHoneyPotSize,\n y: point.y - halfHoneyPotSize\n };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingBackwardsOffScreen(point) {\n return {\n x: Math.max(point.x, 0),\n y: Math.max(point.y, 0)\n };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingForwardsOffScreen(point) {\n return {\n x: Math.min(point.x, window.innerWidth - honeyPotSize),\n y: Math.min(point.y, window.innerHeight - honeyPotSize)\n };\n}\n\n/**\n * Create a `2x2` `DOMRect` around the `client` position\n */\nfunction getHoneyPotRectFor(_ref) {\n var client = _ref.client;\n var point = preventGoingForwardsOffScreen(preventGoingBackwardsOffScreen(pullBackByHalfHoneyPotSize(floorToClosestPixel(client))));\n\n // When debugging, it is helpful to\n // make this element a bit bigger\n return DOMRect.fromRect({\n x: point.x,\n y: point.y,\n width: honeyPotSize,\n height: honeyPotSize\n });\n}\nfunction getRectStyles(_ref2) {\n var clientRect = _ref2.clientRect;\n return {\n left: \"\".concat(clientRect.left, \"px\"),\n top: \"\".concat(clientRect.top, \"px\"),\n width: \"\".concat(clientRect.width, \"px\"),\n height: \"\".concat(clientRect.height, \"px\")\n };\n}\nfunction isWithin(_ref3) {\n var client = _ref3.client,\n clientRect = _ref3.clientRect;\n return (\n // is within horizontal bounds\n client.x >= clientRect.x && client.x <= clientRect.x + clientRect.width &&\n // is within vertical bounds\n client.y >= clientRect.y && client.y <= clientRect.y + clientRect.height\n );\n}\n/**\n * The honey pot fix is designed to get around a painful bug in all browsers.\n *\n * [Overview](https://www.youtube.com/watch?v=udE9qbFTeQg)\n *\n * **Background**\n *\n * When a drag starts, browsers incorrectly think that the users pointer is\n * still depressed where the drag started. Any element that goes under this position\n * will be entered into, causing `\"mouseenter\"` events and `\":hover\"` styles to be applied.\n *\n * _This is a violation of the spec_\n *\n * > \"From the moment that the user agent is to initiate the drag-and-drop operation,\n * > until the end \tof the drag-and-drop operation, device input events\n * > (e.g. mouse and keyboard events) must be suppressed.\"\n * >\n * > - https://html.spec.whatwg.org/multipage/dnd.html#drag-and-drop-processing-model\n *\n * _Some impacts_\n *\n * - `\":hover\"` styles being applied where they shouldn't (looks messy)\n * - components such as tooltips responding to `\"mouseenter\"` can show during a drag,\n * and on an element the user isn't even over\n *\n * Bug: https://issues.chromium.org/issues/41129937\n *\n * **Honey pot fix**\n *\n * 1. Create an element where the browser thinks the depressed pointer is\n * to absorb the incorrect pointer events\n * 2. Remove that element when it is no longer needed\n */\nfunction mountHoneyPot(_ref4) {\n var initial = _ref4.initial;\n var element = document.createElement('div');\n element.setAttribute(honeyPotDataAttribute, 'true');\n\n // Using popover=\"manual\" to place the element in the browser's top layer.\n // This ensures the honey pot is visually on top of everything else,\n // including elements using z-index and other stacking contexts.\n // \"manual\" means no light dismiss — we manage the lifecycle ourselves.\n // Falls back to position:fixed + maxZIndex when the popover API is not available.\n if (supportsPopover()) {\n element.setAttribute('popover', 'manual');\n }\n\n // can shift during the drag thanks to Firefox\n var clientRect = getHoneyPotRectFor({\n client: initial\n });\n Object.assign(element.style, _objectSpread(_objectSpread({\n position: 'fixed'\n }, supportsPopover() ?\n // needs to come first as it has 'inset: unset' which\n // needs to be overridden by our top / left values\n popoverResetUserAgentStyles : {\n // Fallback: using maximum possible z-index so that this element\n // will always be on top of other positioned content.\n zIndex: maxZIndex\n }), {}, {\n // Setting a background color explicitly to avoid any inherited styles.\n // Looks like this could be `opacity: 0`, but worried that _might_\n // cause the element to be ignored on some platforms.\n // When debugging, set backgroundColor to something like \"red\".\n backgroundColor: 'transparent',\n // Being explicit to avoid inheriting styles\n padding: 0,\n margin: 0,\n boxSizing: 'border-box',\n // We want this element to absorb pointer events,\n // it's kind of the whole point 😉\n pointerEvents: 'auto'\n }, getRectStyles({\n clientRect: clientRect\n })));\n document.body.appendChild(element);\n if (supportsPopover()) {\n element.showPopover();\n }\n\n /**\n * 🦊 In firefox we can get `\"pointermove\"` events after the drag\n * has started, which is a spec violation.\n * The final `\"pointermove\"` will reveal where the \"depressed\" position\n * is for our honey pot fix.\n */\n var unbindPointerMove = bind(window, {\n type: 'pointermove',\n listener: function listener(event) {\n var client = {\n x: event.clientX,\n y: event.clientY\n };\n clientRect = getHoneyPotRectFor({\n client: client\n });\n Object.assign(element.style, getRectStyles({\n clientRect: clientRect\n }));\n },\n // using capture so we are less likely to be impacted by event stopping\n options: {\n capture: true\n }\n });\n return function finish(_ref5) {\n var current = _ref5.current;\n // Don't need this any more\n unbindPointerMove();\n\n // If the user is hover the honey pot, we remove it\n // so that the user can continue to interact with the page normally.\n if (isWithin({\n client: current,\n clientRect: clientRect\n })) {\n element.remove();\n return;\n }\n function cleanup() {\n unbindPostDragEvents();\n element.remove();\n }\n var unbindPostDragEvents = bindAll(window, [{\n type: 'pointerdown',\n listener: cleanup\n }, {\n type: 'pointermove',\n listener: cleanup\n }, {\n type: 'focusin',\n listener: cleanup\n }, {\n type: 'focusout',\n listener: cleanup\n },\n // a 'pointerdown' should happen before 'dragstart', but just being super safe\n {\n type: 'dragstart',\n listener: cleanup\n },\n // if the user has dragged something out of the window\n // and then is dragging something back into the window\n // the first events we will see are \"dragenter\" (and then \"dragover\").\n // So if we see any of these we need to clear the post drag fix.\n {\n type: 'dragenter',\n listener: cleanup\n }, {\n type: 'dragover',\n listener: cleanup\n }\n\n // Not adding a \"wheel\" event listener, as \"wheel\" by itself does not\n // resolve the bug.\n ], {\n // Using `capture` so less likely to be impacted by other code stopping events\n capture: true\n });\n };\n}\nexport function makeHoneyPotFix() {\n var latestPointerMove = null;\n function bindEvents() {\n // For sanity, only collecting this value from when events are first bound.\n // This prevents the case where a super old \"pointermove\" could be used\n // from a prior interaction.\n latestPointerMove = null;\n return bind(window, {\n type: 'pointermove',\n listener: function listener(event) {\n latestPointerMove = {\n x: event.clientX,\n y: event.clientY\n };\n },\n // listening for pointer move in capture phase\n // so we are less likely to be impacted by events being stopped.\n options: {\n capture: true\n }\n });\n }\n function getOnPostDispatch() {\n var finish = null;\n return function onPostEvent(_ref6) {\n var eventName = _ref6.eventName,\n payload = _ref6.payload;\n // We are adding the honey pot `onDragStart` so we don't\n // impact the creation of the native drag preview.\n if (eventName === 'onDragStart') {\n var input = payload.location.initial.input;\n\n // Sometimes there will be no latest \"pointermove\" (eg iOS).\n // In which case, we use the start position of the drag.\n var initial = latestPointerMove !== null && latestPointerMove !== void 0 ? latestPointerMove : {\n x: input.clientX,\n y: input.clientY\n };\n\n // Don't need to defensively call `finish()` as `onDrop` from\n // one interaction is guaranteed to be called before `onDragStart`\n // of the next.\n finish = mountHoneyPot({\n initial: initial\n });\n }\n if (eventName === 'onDrop') {\n var _finish;\n var _input = payload.location.current.input;\n (_finish = finish) === null || _finish === void 0 || _finish({\n current: {\n x: _input.clientX,\n y: _input.clientY\n }\n });\n finish = null;\n // this interaction is finished, we want to use\n // the latest \"pointermove\" for each interaction\n latestPointerMove = null;\n }\n };\n }\n return {\n bindEvents: bindEvents,\n getOnPostDispatch: getOnPostDispatch\n };\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import { once } from '../public-utils/once';\n\n// using `cache` as our `isFirefox()` result will not change in a browser\n\n/**\n * Returns `true` if a `Firefox` browser\n * */\nexport var isFirefox = once(function isFirefox() {\n if (process.env.NODE_ENV === 'test') {\n return false;\n }\n return navigator.userAgent.includes('Firefox');\n});","import { once } from '../public-utils/once';\n\n// using `cache` as our `isSafari()` result will not change in a browser\n\n/**\n * Returns `true` if a `Safari` browser.\n * Returns `true` if the browser is running on iOS (they are all Safari).\n *\n * Use `isSafariOnIOS` if you want to check if something is Safari + iOS\n * */\nexport var isSafari = once(function isSafari() {\n if (process.env.NODE_ENV === 'test') {\n return false;\n }\n var _navigator = navigator,\n userAgent = _navigator.userAgent;\n return userAgent.includes('AppleWebKit') && !userAgent.includes('Chrome');\n});","/**\n * Does the `EventTarget` look like a `Node` based on \"duck typing\".\n *\n * Helpful when the `Node` might be outside of the current document\n * so we cannot to an `target instanceof Node` check.\n */\nfunction isNodeLike(target) {\n return 'nodeName' in target;\n}\n\n/**\n * Is an `EventTarget` a `Node` from another `window`?\n */\nexport function isFromAnotherWindow(eventTarget) {\n return isNodeLike(eventTarget) && eventTarget.ownerDocument !== document;\n}","import { bindAll } from 'bind-event-listener';\nimport { isSafari } from '../is-safari';\n\n/* For \"dragenter\" events, the browser should set `relatedTarget` to the previous element.\n * For external drag operations, our first \"dragenter\" event should have a `event.relatedTarget` of `null`.\n *\n * Unfortunately in Safari `event.relatedTarget` is *always* set to `null`\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=242627\n * To work around this we count \"dragenter\" and \"dragleave\" events */\n// Using symbols for event properties so we don't clash with\n// anything on the `event` object\nexport var symbols = {\n isLeavingWindow: Symbol('leaving'),\n isEnteringWindow: Symbol('entering')\n};\n(function fixSafari() {\n // Don't do anything when server side rendering\n if (typeof window === 'undefined') {\n return;\n }\n\n // rather than checking the userAgent for \"jsdom\" we can do this check\n // so that the check will be removed completely in production code\n if (process.env.NODE_ENV === 'test') {\n return;\n }\n if (!isSafari()) {\n return;\n }\n function getInitialState() {\n return {\n enterCount: 0,\n isOverWindow: false\n };\n }\n var state = getInitialState();\n function resetState() {\n state = getInitialState();\n }\n\n // These event listeners are bound _forever_ and _never_ removed\n // We don't bother cleaning up these event listeners (for now)\n // as this workaround is only for Safari\n\n // This is how the event count works:\n //\n // lift (+1 enterCount)\n // - dragstart(draggable) [enterCount: 0]\n // - dragenter(draggable) [enterCount: 1]\n // leaving draggable (+0 enterCount)\n // - dragenter(document.body) [enterCount: 2]\n // - dragleave(draggable) [enterCount: 1]\n // leaving window (-1 enterCount)\n // - dragleave(document.body) [enterCount: 0] {leaving the window}\n\n // Things to note:\n // - dragenter and dragleave bubble\n // - the first dragenter when entering a window might not be on `window`\n // - it could be on an element that is pressed up against the window\n // - (so we cannot rely on `event.target` values)\n\n bindAll(window, [{\n type: 'dragstart',\n listener: function listener() {\n state.enterCount = 0;\n // drag start occurs in the source window\n state.isOverWindow = true;\n // When a drag first starts it will also trigger a \"dragenter\" on the draggable element\n }\n }, {\n type: 'drop',\n listener: resetState\n }, {\n type: 'dragend',\n listener: resetState\n }, {\n type: 'dragenter',\n listener: function listener(event) {\n if (!state.isOverWindow && state.enterCount === 0) {\n // Patching the `event` object\n // The `event` object is shared with all event listeners for the event\n event[symbols.isEnteringWindow] = true;\n }\n state.isOverWindow = true;\n state.enterCount++;\n }\n }, {\n type: 'dragleave',\n listener: function listener(event) {\n state.enterCount--;\n if (state.isOverWindow && state.enterCount === 0) {\n // Patching the `event` object as it is shared with all event listeners\n // The `event` object is shared with all event listeners for the event\n event[symbols.isLeavingWindow] = true;\n state.isOverWindow = false;\n }\n }\n }],\n // using `capture: true` so that adding event listeners\n // in bubble phase will have the correct symbols\n {\n capture: true\n });\n})();","import { isSafari } from '../is-safari';\nimport { symbols } from './count-events-for-safari';\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function isLeavingWindowInSafari(_ref) {\n var dragLeave = _ref.dragLeave;\n if (!isSafari()) {\n return false;\n }\n return dragLeave.hasOwnProperty(symbols.isLeavingWindow);\n}","import { isFirefox } from '../is-firefox';\nimport { isSafari } from '../is-safari';\nimport { isFromAnotherWindow } from './is-from-another-window';\nimport { isLeavingWindowInSafari } from './is-leaving-window-in-safari';\nexport function isLeavingWindow(_ref) {\n var dragLeave = _ref.dragLeave;\n var type = dragLeave.type,\n relatedTarget = dragLeave.relatedTarget;\n if (type !== 'dragleave') {\n return false;\n }\n if (isSafari()) {\n return isLeavingWindowInSafari({\n dragLeave: dragLeave\n });\n }\n\n // Standard check: if going to `null` we are leaving the `window`\n if (relatedTarget == null) {\n return true;\n }\n\n /**\n * 🦊 Exception: `iframe` in Firefox (`125.0`)\n *\n * Case 1: parent `window` → child `iframe`\n * `dragLeave.relatedTarget` is element _inside_ the child `iframe`\n * (foreign element)\n *\n * Case 2: child `iframe` → parent `window`\n * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n * (foreign element)\n */\n\n if (isFirefox()) {\n return isFromAnotherWindow(relatedTarget);\n }\n\n /**\n * 🌏 Exception: `iframe` in Chrome (`124.0`)\n *\n * Case 1: parent `window` → child `iframe`\n * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n *\n * Case 2: child `iframe` → parent `window`\n * `dragLeave.relatedTarget` is `null` *(standard check)*\n */\n\n // Case 2\n // Using `instanceof` check as the element will be in the same `window`\n return relatedTarget instanceof HTMLIFrameElement;\n}","export function getBindingsForBrokenDrags(_ref) {\n var onDragEnd = _ref.onDragEnd;\n return [\n // ## Detecting drag ending for removed draggables\n //\n // If a draggable element is removed during a drag and the user drops:\n // 1. if over a valid drop target: we get a \"drop\" event to know the drag is finished\n // 2. if not over a valid drop target (or cancelled): we get nothing\n // The \"dragend\" event will not fire on the source draggable if it has been\n // removed from the DOM.\n // So we need to figure out if a drag operation has finished by looking at other events\n // We can do this by looking at other events\n\n // ### First detection: \"pointermove\" events\n\n // 1. \"pointermove\" events cannot fire during a drag and drop operation\n // according to the spec. So if we get a \"pointermove\" it means that\n // the drag and drop operations has finished. So if we get a \"pointermove\"\n // we know that the drag is over\n // 2. 🦊😤 Drag and drop operations are _supposed_ to suppress\n // other pointer events. However, firefox will allow a few\n // pointer event to get through after a drag starts.\n // The most I've seen is 3\n {\n type: 'pointermove',\n listener: function () {\n var callCount = 0;\n return function listener() {\n // Using 20 as it is far bigger than the most observed (3)\n if (callCount < 20) {\n callCount++;\n return;\n }\n onDragEnd();\n };\n }()\n },\n // ### Second detection: \"pointerdown\" events\n\n // If we receive this event then we know that a drag operation has finished\n // and potentially another one is about to start.\n // Note: `pointerdown` fires on all browsers / platforms before \"dragstart\"\n {\n type: 'pointerdown',\n listener: onDragEnd\n }];\n}","export function getInput(event) {\n return {\n altKey: event.altKey,\n button: event.button,\n buttons: event.buttons,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY\n };\n}","var rafSchd = function rafSchd(fn) {\n var lastArgs = [];\n var frameId = null;\n\n var wrapperFn = function wrapperFn() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n\n if (frameId) {\n return;\n }\n\n frameId = requestAnimationFrame(function () {\n frameId = null;\n fn.apply(void 0, lastArgs);\n });\n };\n\n wrapperFn.cancel = function () {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n };\n\n return wrapperFn;\n};\n\nexport default rafSchd;\n","import rafSchd from 'raf-schd';\nvar scheduleOnDrag = rafSchd(function (fn) {\n return fn();\n});\nvar dragStart = function () {\n var scheduled = null;\n function schedule(fn) {\n var frameId = requestAnimationFrame(function () {\n scheduled = null;\n fn();\n });\n scheduled = {\n frameId: frameId,\n fn: fn\n };\n }\n function flush() {\n if (scheduled) {\n cancelAnimationFrame(scheduled.frameId);\n scheduled.fn();\n scheduled = null;\n }\n }\n return {\n schedule: schedule,\n flush: flush\n };\n}();\nexport function makeDispatch(_ref) {\n var source = _ref.source,\n initial = _ref.initial,\n dispatchEvent = _ref.dispatchEvent;\n var previous = {\n dropTargets: []\n };\n function safeDispatch(args) {\n dispatchEvent(args);\n previous = {\n dropTargets: args.payload.location.current.dropTargets\n };\n }\n var dispatch = {\n start: function start(_ref2) {\n var nativeSetDragImage = _ref2.nativeSetDragImage;\n // Ensuring that both `onGenerateDragPreview` and `onDragStart` get the same location.\n // We do this so that `previous` is`[]` in `onDragStart` (which is logical)\n var location = {\n current: initial,\n previous: previous,\n initial: initial\n };\n // a `onGenerateDragPreview` does _not_ add another entry for `previous`\n // onDragPreview\n safeDispatch({\n eventName: 'onGenerateDragPreview',\n payload: {\n source: source,\n location: location,\n nativeSetDragImage: nativeSetDragImage\n }\n });\n dragStart.schedule(function () {\n safeDispatch({\n eventName: 'onDragStart',\n payload: {\n source: source,\n location: location\n }\n });\n });\n },\n dragUpdate: function dragUpdate(_ref3) {\n var current = _ref3.current;\n dragStart.flush();\n scheduleOnDrag.cancel();\n safeDispatch({\n eventName: 'onDropTargetChange',\n payload: {\n source: source,\n location: {\n initial: initial,\n previous: previous,\n current: current\n }\n }\n });\n },\n drag: function drag(_ref4) {\n var current = _ref4.current;\n scheduleOnDrag(function () {\n dragStart.flush();\n var location = {\n initial: initial,\n previous: previous,\n current: current\n };\n safeDispatch({\n eventName: 'onDrag',\n payload: {\n source: source,\n location: location\n }\n });\n });\n },\n drop: function drop(_ref5) {\n var current = _ref5.current,\n updatedSourcePayload = _ref5.updatedSourcePayload;\n dragStart.flush();\n scheduleOnDrag.cancel();\n safeDispatch({\n eventName: 'onDrop',\n payload: {\n source: updatedSourcePayload !== null && updatedSourcePayload !== void 0 ? updatedSourcePayload : source,\n location: {\n current: current,\n previous: previous,\n initial: initial\n }\n }\n });\n }\n };\n return dispatch;\n}","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport { bindAll } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { isHoneyPotElement } from '../honey-pot-fix/is-honey-pot-element';\nimport { isLeavingWindow } from '../util/changing-window/is-leaving-window';\nimport { getBindingsForBrokenDrags } from '../util/detect-broken-drag';\nimport { getInput } from '../util/get-input';\nimport { makeDispatch } from './dispatch-consumer-event';\nvar globalState = {\n isActive: false\n};\nfunction canStart() {\n return !globalState.isActive;\n}\nfunction getNativeSetDragImage(event) {\n if (event.dataTransfer) {\n // need to use `.bind` as `setDragImage` is required\n // to be run with `event.dataTransfer` as the \"this\" context\n return event.dataTransfer.setDragImage.bind(event.dataTransfer);\n }\n return null;\n}\nfunction hasHierarchyChanged(_ref) {\n var current = _ref.current,\n next = _ref.next;\n if (current.length !== next.length) {\n return true;\n }\n // not checking stickiness, data or dropEffect,\n // just whether the hierarchy has changed\n for (var i = 0; i < current.length; i++) {\n if (current[i].element !== next[i].element) {\n return true;\n }\n }\n return false;\n}\nfunction start(_ref2) {\n var event = _ref2.event,\n dragType = _ref2.dragType,\n getDropTargetsOver = _ref2.getDropTargetsOver,\n dispatchEvent = _ref2.dispatchEvent;\n if (!canStart()) {\n return;\n }\n var initial = getStartLocation({\n event: event,\n dragType: dragType,\n getDropTargetsOver: getDropTargetsOver\n });\n globalState.isActive = true;\n var state = {\n current: initial\n };\n\n // Setting initial drop effect for the drag\n setDropEffectOnEvent({\n event: event,\n current: initial.dropTargets\n });\n var dispatch = makeDispatch({\n source: dragType.payload,\n dispatchEvent: dispatchEvent,\n initial: initial\n });\n function updateState(next) {\n // only looking at whether hierarchy has changed to determine whether something as 'changed'\n var hasChanged = hasHierarchyChanged({\n current: state.current.dropTargets,\n next: next.dropTargets\n });\n\n // Always updating the state to include latest data, dropEffect and stickiness\n // Only updating consumers if the hierarchy has changed in some way\n // Consumers can get the latest data by using `onDrag`\n state.current = next;\n if (hasChanged) {\n dispatch.dragUpdate({\n current: state.current\n });\n }\n }\n function onUpdateEvent(event) {\n var input = getInput(event);\n\n // If we are over the honey pot, we need to get the element\n // that the user would have been over if not for the honey pot\n var target = isHoneyPotElement(event.target) ? getElementFromPointWithoutHoneypot({\n x: input.clientX,\n y: input.clientY\n }) : event.target;\n var nextDropTargets = getDropTargetsOver({\n target: target,\n input: input,\n source: dragType.payload,\n current: state.current.dropTargets\n });\n if (nextDropTargets.length) {\n // 🩸 must call `event.preventDefault()` to allow a browser drop to occur\n event.preventDefault();\n setDropEffectOnEvent({\n event: event,\n current: nextDropTargets\n });\n }\n updateState({\n dropTargets: nextDropTargets,\n input: input\n });\n }\n function cancel() {\n // The spec behaviour is that when a drag is cancelled, or when dropping on no drop targets,\n // a \"dragleave\" event is fired on the active drop target before a \"dragend\" event.\n // We are replicating that behaviour in `cancel` if there are any active drop targets to\n // ensure consistent behaviour.\n //\n // Note: When cancelling, or dropping on no drop targets, a \"dragleave\" event\n // will have already cleared the dropTargets to `[]` (as that particular \"dragleave\" has a `relatedTarget` of `null`)\n\n if (state.current.dropTargets.length) {\n updateState({\n dropTargets: [],\n input: state.current.input\n });\n }\n dispatch.drop({\n current: state.current,\n updatedSourcePayload: null\n });\n finish();\n }\n function finish() {\n globalState.isActive = false;\n unbindEvents();\n }\n var unbindEvents = bindAll(window, [{\n // 👋 Note: we are repurposing the `dragover` event as our `drag` event\n // this is because firefox does not publish pointer coordinates during\n // a `drag` event, but does for every other type of drag event\n // `dragover` fires on all elements that are being dragged over\n // Because we are binding to `window` - our `dragover` is effectively the same as a `drag`\n // 🦊😤\n type: 'dragover',\n listener: function listener(event) {\n // We need to regularly calculate the drop targets in order to allow:\n // - dynamic `canDrop()` checks\n // - rapid updating `getData()` calls to attach data in response to user input (eg for edge detection)\n // Sadly we cannot schedule inspecting changes resulting from this event\n // we need to be able to conditionally cancel the event with `event.preventDefault()`\n // to enable the correct native drop experience.\n\n // 1. check to see if anything has changed\n onUpdateEvent(event);\n\n // 2. let consumers know a move has occurred\n // This will include the latest 'input' values\n dispatch.drag({\n current: state.current\n });\n }\n }, {\n type: 'dragenter',\n listener: onUpdateEvent\n }, {\n type: 'dragleave',\n listener: function listener(event) {\n if (!isLeavingWindow({\n dragLeave: event\n })) {\n return;\n }\n\n /**\n * At this point we don't know if a drag is being cancelled,\n * or if a drag is leaving the `window`.\n *\n * Both have:\n * 1. \"dragleave\" (with `relatedTarget: null`)\n * 2. \"dragend\" (a \"dragend\" can occur when outside the `window`)\n *\n * **Clearing drop targets**\n *\n * For either case we are clearing the the drop targets\n *\n * - cancelling: we clear drop targets in `\"dragend\"` anyway\n * - leaving the `window`: we clear the drop targets (to clear stickiness)\n *\n * **Leaving the window and finishing the drag**\n *\n * _internal drags_\n *\n * - The drag continues when the user is outside the `window`\n * and can resume if the user drags back over the `window`,\n * or end when the user drops in an external `window`.\n * - We will get a `\"dragend\"`, or we can listen for other\n * events to determine the drag is finished when the user re-enters the `window`).\n *\n * _external drags_\n *\n * - We conclude the drag operation.\n * - We have no idea if the user will drag back over the `window`,\n * or if the drag ends elsewhere.\n * - We will create a new drag if the user re-enters the `window`.\n *\n * **Not updating `input`**\n *\n * 🐛 Bug[Chrome] the final `\"dragleave\"` has default input values (eg `clientX == 0`)\n * Workaround: intentionally not updating `input` in \"dragleave\"\n * rather than the users current input values\n * - [Conversation](https://twitter.com/alexandereardon/status/1642697633864241152)\n * - [Bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1429937)\n **/\n\n updateState({\n input: state.current.input,\n dropTargets: []\n });\n if (dragType.startedFrom === 'external') {\n cancel();\n }\n }\n }, {\n // A \"drop\" can only happen if the browser allowed the drop\n type: 'drop',\n listener: function listener(event) {\n // Capture the final input.\n // We are capturing the final `input` for the\n // most accurate honey pot experience\n state.current = {\n dropTargets: state.current.dropTargets,\n input: getInput(event)\n };\n\n /** If there are no drop targets, then we will get\n * a \"drop\" event if:\n * - `preventUnhandled()` is being used\n * - there is an unmanaged drop target (eg another library)\n * In these cases, it's up to the consumer\n * to handle the drop if it's not over one of our drop targets\n * - `preventUnhandled()` will cancel the \"drop\"\n * - unmanaged drop targets can handle the \"drop\" how they want to\n * We won't call `event.preventDefault()` in this call path */\n\n if (!state.current.dropTargets.length) {\n cancel();\n return;\n }\n event.preventDefault();\n\n // applying the latest drop effect to the event\n setDropEffectOnEvent({\n event: event,\n current: state.current.dropTargets\n });\n dispatch.drop({\n current: state.current,\n // When dropping something native, we need to extract the latest\n // `.items` from the \"drop\" event as it is now accessible\n updatedSourcePayload: dragType.type === 'external' ? dragType.getDropPayload(event) : null\n });\n finish();\n }\n }, {\n // \"dragend\" fires when on the drag source (eg a draggable element)\n // when the drag is finished.\n // \"dragend\" will fire after \"drop\" (if there was a successful drop)\n // \"dragend\" does not fire if the draggable source has been removed during the drag\n // or for external drag sources (eg files)\n\n // This \"dragend\" listener will not fire if there was a successful drop\n // as we will have already removed the event listener\n\n type: 'dragend',\n listener: function listener(event) {\n // In firefox, the position of the \"dragend\" event can\n // be a bit different to the last \"dragover\" event.\n // Updating the input so we can get the best possible\n // information for the honey pot.\n state.current = {\n dropTargets: state.current.dropTargets,\n input: getInput(event)\n };\n cancel();\n }\n }].concat(_toConsumableArray(getBindingsForBrokenDrags({\n onDragEnd: cancel\n }))),\n // Once we have started a managed drag operation it is important that we see / own all drag events\n // We got one adoption bug pop up where some code was stopping (`event.stopPropagation()`)\n // all \"drop\" events in the bubble phase on the `document.body`.\n // This meant that we never saw the \"drop\" event.\n {\n capture: true\n });\n dispatch.start({\n nativeSetDragImage: getNativeSetDragImage(event)\n });\n}\nfunction setDropEffectOnEvent(_ref3) {\n var _current$;\n var event = _ref3.event,\n current = _ref3.current;\n // setting the `dropEffect` to be the innerMost drop targets dropEffect\n var innerMost = (_current$ = current[0]) === null || _current$ === void 0 ? void 0 : _current$.dropEffect;\n if (innerMost != null && event.dataTransfer) {\n event.dataTransfer.dropEffect = innerMost;\n }\n}\nfunction getStartLocation(_ref4) {\n var event = _ref4.event,\n dragType = _ref4.dragType,\n getDropTargetsOver = _ref4.getDropTargetsOver;\n var input = getInput(event);\n\n // When dragging from outside of the browser,\n // the drag is not being sourced from any local drop targets\n if (dragType.startedFrom === 'external') {\n return {\n input: input,\n dropTargets: []\n };\n }\n var dropTargets = getDropTargetsOver({\n input: input,\n source: dragType.payload,\n target: event.target,\n current: []\n });\n return {\n input: input,\n dropTargets: dropTargets\n };\n}\nexport var lifecycle = {\n canStart: canStart,\n start: start\n};","// Extending `Map` to allow us to link Key and Values together\n\nvar ledger = new Map();\nfunction registerUsage(_ref) {\n var typeKey = _ref.typeKey,\n mount = _ref.mount;\n var entry = ledger.get(typeKey);\n if (entry) {\n entry.usageCount++;\n return entry;\n }\n var initial = {\n typeKey: typeKey,\n unmount: mount(),\n usageCount: 1\n };\n ledger.set(typeKey, initial);\n return initial;\n}\nexport function register(args) {\n var entry = registerUsage(args);\n return function unregister() {\n entry.usageCount--;\n if (entry.usageCount > 0) {\n return;\n }\n // Only a single usage left, remove it\n entry.unmount();\n ledger.delete(args.typeKey);\n };\n}","/** Create a new combined function that will call all the provided functions */\nexport function combine() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n return function cleanup() {\n fns.forEach(function (fn) {\n return fn();\n });\n };\n}","export function addAttribute(element, _ref) {\n var attribute = _ref.attribute,\n value = _ref.value;\n element.setAttribute(attribute, value);\n return function () {\n return element.removeAttribute(attribute);\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nfunction copyReverse(array) {\n return array.slice(0).reverse();\n}\nexport function makeDropTarget(_ref) {\n var typeKey = _ref.typeKey,\n defaultDropEffect = _ref.defaultDropEffect;\n var registry = new WeakMap();\n var dropTargetDataAtt = \"data-drop-target-for-\".concat(typeKey);\n var dropTargetSelector = \"[\".concat(dropTargetDataAtt, \"]\");\n function addToRegistry(args) {\n registry.set(args.element, args);\n return function () {\n return registry.delete(args.element);\n };\n }\n function dropTargetForConsumers(args) {\n // Guardrail: warn if the draggable element is already registered\n if (process.env.NODE_ENV !== 'production') {\n var existing = registry.get(args.element);\n if (existing) {\n // eslint-disable-next-line no-console\n console.warn(\"You have already registered a [\".concat(typeKey, \"] dropTarget on the same element\"), {\n existing: existing,\n proposed: args\n });\n }\n if (args.element instanceof HTMLIFrameElement) {\n // eslint-disable-next-line no-console\n console.warn(\"\\n We recommend not registering <iframe> elements as drop targets\\n as it can result in some strange browser event ordering.\\n \" // Removing newlines and excessive whitespace\n .replace(/\\s{2,}/g, ' ').trim());\n }\n }\n var cleanup = combine(addAttribute(args.element, {\n attribute: dropTargetDataAtt,\n value: 'true'\n }), addToRegistry(args));\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n }\n function getActualDropTargets(_ref2) {\n var _args$getData, _args$getData2, _args$getDropEffect, _args$getDropEffect2;\n var source = _ref2.source,\n target = _ref2.target,\n input = _ref2.input,\n _ref2$result = _ref2.result,\n result = _ref2$result === void 0 ? [] : _ref2$result;\n if (target == null) {\n return result;\n }\n if (!(target instanceof Element)) {\n // For \"text-selection\" drags, the original `target`\n // is not an `Element`, so we need to start looking from\n // the parent element\n if (target instanceof Node) {\n return getActualDropTargets({\n source: source,\n target: target.parentElement,\n input: input,\n result: result\n });\n }\n\n // not sure what we are working with,\n // so we can exit.\n return result;\n }\n var closest = target.closest(dropTargetSelector);\n\n // Cannot find anything else\n if (closest == null) {\n return result;\n }\n var args = registry.get(closest);\n\n // error: something had a dropTargetSelector but we could not\n // find a match. For now, failing silently\n if (args == null) {\n return result;\n }\n var feedback = {\n input: input,\n source: source,\n element: args.element\n };\n\n // if dropping is not allowed, skip this drop target\n // and continue looking up the DOM tree\n if (args.canDrop && !args.canDrop(feedback)) {\n return getActualDropTargets({\n source: source,\n target: args.element.parentElement,\n input: input,\n result: result\n });\n }\n\n // calculate our new record\n var data = (_args$getData = (_args$getData2 = args.getData) === null || _args$getData2 === void 0 ? void 0 : _args$getData2.call(args, feedback)) !== null && _args$getData !== void 0 ? _args$getData : {};\n var dropEffect = (_args$getDropEffect = (_args$getDropEffect2 = args.getDropEffect) === null || _args$getDropEffect2 === void 0 ? void 0 : _args$getDropEffect2.call(args, feedback)) !== null && _args$getDropEffect !== void 0 ? _args$getDropEffect : defaultDropEffect;\n var record = {\n data: data,\n element: args.element,\n dropEffect: dropEffect,\n // we are collecting _actual_ drop targets, so these are\n // being applied _not_ due to stickiness\n isActiveDueToStickiness: false\n };\n return getActualDropTargets({\n source: source,\n target: args.element.parentElement,\n input: input,\n // Using bubble ordering. Same ordering as `event.getPath()`\n result: [].concat(_toConsumableArray(result), [record])\n });\n }\n function notifyCurrent(_ref3) {\n var eventName = _ref3.eventName,\n payload = _ref3.payload;\n var _iterator = _createForOfIteratorHelper(payload.location.current.dropTargets),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _entry$eventName;\n var record = _step.value;\n var entry = registry.get(record.element);\n var args = _objectSpread(_objectSpread({}, payload), {}, {\n self: record\n });\n entry === null || entry === void 0 || (_entry$eventName = entry[eventName]) === null || _entry$eventName === void 0 || _entry$eventName.call(entry,\n // I cannot seem to get the types right here.\n // TS doesn't seem to like that one event can need `nativeSetDragImage`\n // @ts-expect-error\n args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n var actions = {\n onGenerateDragPreview: notifyCurrent,\n onDrag: notifyCurrent,\n onDragStart: notifyCurrent,\n onDrop: notifyCurrent,\n onDropTargetChange: function onDropTargetChange(_ref4) {\n var payload = _ref4.payload;\n var isCurrent = new Set(payload.location.current.dropTargets.map(function (record) {\n return record.element;\n }));\n var visited = new Set();\n var _iterator2 = _createForOfIteratorHelper(payload.location.previous.dropTargets),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _entry$onDropTargetCh;\n var record = _step2.value;\n visited.add(record.element);\n var entry = registry.get(record.element);\n var isOver = isCurrent.has(record.element);\n var args = _objectSpread(_objectSpread({}, payload), {}, {\n self: record\n });\n entry === null || entry === void 0 || (_entry$onDropTargetCh = entry.onDropTargetChange) === null || _entry$onDropTargetCh === void 0 || _entry$onDropTargetCh.call(entry, args);\n\n // if we cannot find the drop target in the current array, then it has been left\n if (!isOver) {\n var _entry$onDragLeave;\n entry === null || entry === void 0 || (_entry$onDragLeave = entry.onDragLeave) === null || _entry$onDragLeave === void 0 || _entry$onDragLeave.call(entry, args);\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n var _iterator3 = _createForOfIteratorHelper(payload.location.current.dropTargets),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var _entry$onDropTargetCh2, _entry$onDragEnter;\n var _record = _step3.value;\n // already published an update to this drop target\n if (visited.has(_record.element)) {\n continue;\n }\n // at this point we have a new drop target that is being entered into\n var _args = _objectSpread(_objectSpread({}, payload), {}, {\n self: _record\n });\n var _entry = registry.get(_record.element);\n _entry === null || _entry === void 0 || (_entry$onDropTargetCh2 = _entry.onDropTargetChange) === null || _entry$onDropTargetCh2 === void 0 || _entry$onDropTargetCh2.call(_entry, _args);\n _entry === null || _entry === void 0 || (_entry$onDragEnter = _entry.onDragEnter) === null || _entry$onDragEnter === void 0 || _entry$onDragEnter.call(_entry, _args);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n };\n function dispatchEvent(args) {\n actions[args.eventName](args);\n }\n function getIsOver(_ref5) {\n var source = _ref5.source,\n target = _ref5.target,\n input = _ref5.input,\n current = _ref5.current;\n var actual = getActualDropTargets({\n source: source,\n target: target,\n input: input\n });\n\n // stickiness is only relevant when we have less\n // drop targets than we did before\n if (actual.length >= current.length) {\n return actual;\n }\n\n // less 'actual' drop targets than before,\n // we need to see if 'stickiness' applies\n\n // An old drop target will continue to be dropped on if:\n // 1. it has the same parent\n // 2. nothing exists in it's previous index\n\n var lastCaptureOrdered = copyReverse(current);\n var actualCaptureOrdered = copyReverse(actual);\n var resultCaptureOrdered = [];\n for (var index = 0; index < lastCaptureOrdered.length; index++) {\n var _argsForLast$getIsSti;\n var last = lastCaptureOrdered[index];\n var fresh = actualCaptureOrdered[index];\n\n // if a record is in the new index -> use that\n // it will have the latest data + dropEffect\n if (fresh != null) {\n resultCaptureOrdered.push(fresh);\n continue;\n }\n\n // At this point we have no drop target in the old spot\n // Check to see if we can use a previous sticky drop target\n\n // The \"parent\" is the one inside of `resultCaptureOrdered`\n // (the parent might be a drop target that was sticky)\n var parent = resultCaptureOrdered[index - 1];\n var lastParent = lastCaptureOrdered[index - 1];\n\n // Stickiness is based on parent relationships, so if the parent relationship has change\n // then we can stop our search\n if ((parent === null || parent === void 0 ? void 0 : parent.element) !== (lastParent === null || lastParent === void 0 ? void 0 : lastParent.element)) {\n break;\n }\n\n // We need to check whether the old drop target can still be dropped on\n\n var argsForLast = registry.get(last.element);\n\n // We cannot drop on a drop target that is no longer mounted\n if (!argsForLast) {\n break;\n }\n var feedback = {\n input: input,\n source: source,\n element: argsForLast.element\n };\n\n // We cannot drop on a drop target that no longer allows being dropped on\n if (argsForLast.canDrop && !argsForLast.canDrop(feedback)) {\n break;\n }\n\n // We cannot drop on a drop target that is no longer sticky\n if (!((_argsForLast$getIsSti = argsForLast.getIsSticky) !== null && _argsForLast$getIsSti !== void 0 && _argsForLast$getIsSti.call(argsForLast, feedback))) {\n break;\n }\n\n // Note: intentionally not recollecting `getData()` or `getDropEffect()`\n // Previous values for `data` and `dropEffect` will be borrowed\n // This is to prevent things like the 'closest edge' changing when\n // no longer over a drop target.\n // We could change our mind on this behaviour in the future\n\n resultCaptureOrdered.push(_objectSpread(_objectSpread({}, last), {}, {\n // making it clear to consumers this drop target is active due to stickiness\n isActiveDueToStickiness: true\n }));\n }\n\n // return bubble ordered result\n return copyReverse(resultCaptureOrdered);\n }\n return {\n dropTargetForConsumers: dropTargetForConsumers,\n getIsOver: getIsOver,\n dispatchEvent: dispatchEvent\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { once } from '../public-utils/once';\nexport function makeMonitor() {\n var registry = new Set();\n var dragging = null;\n function tryAddToActive(monitor) {\n if (!dragging) {\n return;\n }\n // Monitor is allowed to monitor events if:\n // 1. It has no `canMonitor` function (default is that a monitor can listen to everything)\n // 2. `canMonitor` returns true\n if (!monitor.canMonitor || monitor.canMonitor(dragging.canMonitorArgs)) {\n dragging.active.add(monitor);\n }\n }\n function monitorForConsumers(args) {\n // We are giving each `args` a new reference so that you\n // can create multiple monitors with the same `args`.\n var entry = _objectSpread({}, args);\n registry.add(entry);\n\n // if there is an active drag we need to see if this new monitor is relevant\n tryAddToActive(entry);\n function cleanup() {\n registry.delete(entry);\n\n // We need to stop publishing events during a drag to this monitor!\n if (dragging) {\n dragging.active.delete(entry);\n }\n }\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n }\n function dispatchEvent(_ref) {\n var eventName = _ref.eventName,\n payload = _ref.payload;\n if (eventName === 'onGenerateDragPreview') {\n dragging = {\n canMonitorArgs: {\n initial: payload.location.initial,\n source: payload.source\n },\n active: new Set()\n };\n var _iterator = _createForOfIteratorHelper(registry),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var monitor = _step.value;\n tryAddToActive(monitor);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n // This should never happen.\n if (!dragging) {\n return;\n }\n\n // Creating an array from the set _before_ iterating\n // This is so that monitors added during the current event will not be called.\n // This behaviour matches native EventTargets where an event listener\n // cannot add another event listener during an active event to the same\n // event target in the same event (for us we have a single global event target)\n var active = Array.from(dragging.active);\n for (var _i = 0, _active = active; _i < _active.length; _i++) {\n var _monitor = _active[_i];\n // A monitor can be removed by another monitor during an event.\n // We need to check that the monitor is still registered before calling it\n if (dragging.active.has(_monitor)) {\n var _monitor$eventName;\n // @ts-expect-error: I cannot get this type working!\n (_monitor$eventName = _monitor[eventName]) === null || _monitor$eventName === void 0 || _monitor$eventName.call(_monitor, payload);\n }\n }\n if (eventName === 'onDrop') {\n dragging.active.clear();\n dragging = null;\n }\n }\n return {\n dispatchEvent: dispatchEvent,\n monitorForConsumers: monitorForConsumers\n };\n}","import { lifecycle } from '../ledger/lifecycle-manager';\nimport { register } from '../ledger/usage-ledger';\nimport { makeDropTarget } from './make-drop-target';\nimport { makeMonitor } from './make-monitor';\nexport function makeAdapter(_ref) {\n var typeKey = _ref.typeKey,\n mount = _ref.mount,\n dispatchEventToSource = _ref.dispatchEventToSource,\n onPostDispatch = _ref.onPostDispatch,\n defaultDropEffect = _ref.defaultDropEffect;\n var monitorAPI = makeMonitor();\n var dropTargetAPI = makeDropTarget({\n typeKey: typeKey,\n defaultDropEffect: defaultDropEffect\n });\n function dispatchEvent(args) {\n // 1. forward the event to source\n dispatchEventToSource === null || dispatchEventToSource === void 0 || dispatchEventToSource(args);\n\n // 2. forward the event to relevant dropTargets\n dropTargetAPI.dispatchEvent(args);\n\n // 3. forward event to monitors\n monitorAPI.dispatchEvent(args);\n\n // 4. post consumer dispatch (used for honey pot fix)\n onPostDispatch === null || onPostDispatch === void 0 || onPostDispatch(args);\n }\n function start(_ref2) {\n var event = _ref2.event,\n dragType = _ref2.dragType;\n lifecycle.start({\n event: event,\n dragType: dragType,\n getDropTargetsOver: dropTargetAPI.getIsOver,\n dispatchEvent: dispatchEvent\n });\n }\n function registerUsage() {\n function mountAdapter() {\n var api = {\n canStart: lifecycle.canStart,\n start: start\n };\n return mount(api);\n }\n return register({\n typeKey: typeKey,\n mount: mountAdapter\n });\n }\n return {\n registerUsage: registerUsage,\n dropTarget: dropTargetAPI.dropTargetForConsumers,\n monitor: monitorAPI.monitorForConsumers\n };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\nexport var isAndroid = once(function isAndroid() {\n return navigator.userAgent.toLocaleLowerCase().includes('android');\n});\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var androidFallbackText = 'pdnd:android-fallback';","// Why we put the media types in their own files:\n//\n// - we are not putting them all in one file as not all adapters need all types\n// - we are not putting them in the external helpers as some things just need the\n// types and not the external functions code\nexport var textMediaType = 'text/plain';","// Why we put the media types in their own files:\n//\n// - we are not putting them all in one file as not all adapters need all types\n// - we are not putting them in the external helpers as some things just need the\n// types and not the external functions code\nexport var URLMediaType = 'text/uri-list';","/**\n * This key has been pulled into a separate module\n * so that the external adapter does not need to import\n * the element adapter\n */\nexport var elementAdapterNativeDataKey = 'application/vnd.pdnd';","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { bind } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { makeHoneyPotFix } from '../honey-pot-fix/make-honey-pot-fix';\nimport { makeAdapter } from '../make-adapter/make-adapter';\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nimport { androidFallbackText, isAndroid } from '../util/android';\nimport { getInput } from '../util/get-input';\nimport { textMediaType } from '../util/media-types/text-media-type';\nimport { URLMediaType } from '../util/media-types/url-media-type';\nimport { elementAdapterNativeDataKey } from './element-adapter-native-data-key';\n\n// Payload for the draggable being dragged\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-re-exports\n\nvar draggableRegistry = new WeakMap();\nfunction addToRegistry(args) {\n draggableRegistry.set(args.element, args);\n return function cleanup() {\n draggableRegistry.delete(args.element);\n };\n}\nvar honeyPotFix = makeHoneyPotFix();\nvar adapter = makeAdapter({\n typeKey: 'element',\n defaultDropEffect: 'move',\n mount: function mount(api) {\n /** Binding event listeners the `document` rather than `window` so that\n * this adapter always gets preference over the text adapter.\n * `document` is the first `EventTarget` under `window`\n * https://twitter.com/alexandereardon/status/1604658588311465985\n */\n return combine(honeyPotFix.bindEvents(), bind(document, {\n type: 'dragstart',\n listener: function listener(event) {\n var _entry$dragHandle, _entry$getInitialData, _entry$getInitialData2, _entry$dragHandle2, _entry$getInitialData3, _entry$getInitialData4;\n if (!api.canStart(event)) {\n return;\n }\n\n // If the \"dragstart\" event is cancelled, then a drag won't start\n // There will be no further drag operation events (eg no \"dragend\" event)\n if (event.defaultPrevented) {\n return;\n }\n\n // Technically `dataTransfer` can be `null` according to the types\n // But that behaviour does not seem to appear in the spec.\n // If there is not `dataTransfer`, we can assume something is wrong and not\n // start a drag\n if (!event.dataTransfer) {\n // Including this code on \"test\" and \"development\" environments:\n // - Browser tests commonly run against \"development\" builds\n // - Unit tests commonly run in \"test\"\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\"\\n It appears as though you have are not testing DragEvents correctly.\\n\\n - If you are unit testing, ensure you have polyfilled DragEvent.\\n - If you are browser testing, ensure you are dispatching drag events correctly.\\n\\n Please see our testing guides for more information:\\n https://atlassian.design/components/pragmatic-drag-and-drop/core-package/testing\\n \".replace(/ {2}/g, ''));\n }\n return;\n }\n\n // the closest parent that is a draggable element will be marked as\n // the `event.target` for the event\n var target = event.target;\n\n // this source is only for elements\n // Note: only HTMLElements can have the \"draggable\" attribute\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // see if the thing being dragged is owned by us\n var entry = draggableRegistry.get(target);\n\n // no matching element found\n // → dragging an element with `draggable=\"true\"` that is not controlled by us\n if (!entry) {\n return;\n }\n\n /**\n * A text selection drag _can_ have the `draggable` element be\n * the `event.target` if the user is dragging the text selection\n * from the `draggable`.\n *\n * To know if the `draggable` is being dragged, we look at whether any\n * `\"text/plain\"` data is being dragged. If it is, then a text selection\n * drag is occurring.\n *\n * This behaviour has been validated on:\n *\n * - Chrome@128 on Android@14\n * - Chrome@128 on iOS@17.6.1\n * - Chrome@128 on Windows@11\n * - Chrome@128 on MacOS@14.6.1\n * - Firefox@129 on Windows@11 (not possible for user to select text in a draggable)\n * - Firefox@129 on MacOS@14.6.1 (not possible for user to select text in a draggable)\n *\n * Note: Could usually just use: `event.dataTransfer.types.includes(textMediaType)`\n * but unfortunately ProseMirror is always setting `\"\"` as the dragged text\n *\n * Note: Unfortunately editor is (heavily) leaning on the current functionality today\n * and unwinding it will be a decent amount of effort. So for now, a text selection\n * where the `event.target` is a `draggable` element will still trigger the\n * element adapter.\n *\n * // Future state:\n * if(event.dataTransfer.getData(textMediaType)) {\n * \treturn;\n * }\n *\n */\n\n var input = getInput(event);\n var feedback = {\n element: entry.element,\n dragHandle: (_entry$dragHandle = entry.dragHandle) !== null && _entry$dragHandle !== void 0 ? _entry$dragHandle : null,\n input: input\n };\n\n // Check: does the draggable want to allow dragging?\n if (entry.canDrag && !entry.canDrag(feedback)) {\n // cancel drag operation if we cannot drag\n event.preventDefault();\n return;\n }\n\n // Check: is there a drag handle and is the user using it?\n if (entry.dragHandle) {\n // technically don't need this util, but just being\n // consistent with how we look up what is under the users\n // cursor.\n var over = getElementFromPointWithoutHoneypot({\n x: input.clientX,\n y: input.clientY\n });\n\n // if we are not dragging from the drag handle (or something inside the drag handle)\n // then we will cancel the active drag\n if (!entry.dragHandle.contains(over)) {\n event.preventDefault();\n return;\n }\n }\n\n /**\n * **Goal**\n * Pass information to other applications\n *\n * **Approach**\n * Put data into the native data store\n *\n * **What about the native adapter?**\n * When the element adapter puts native data into the native data store\n * the native adapter is not triggered in the current window,\n * but a native adapter in an external window _can_ be triggered\n *\n * **Why bake this into core?**\n * This functionality could be pulled out and exposed inside of\n * `onGenerateDragPreview`. But decided to make it a part of the\n * base API as it felt like a common enough use case and ended\n * up being a similar amount of code to include this function as\n * it was to expose the hook for it\n */\n var nativeData = (_entry$getInitialData = (_entry$getInitialData2 = entry.getInitialDataForExternal) === null || _entry$getInitialData2 === void 0 ? void 0 : _entry$getInitialData2.call(entry, feedback)) !== null && _entry$getInitialData !== void 0 ? _entry$getInitialData : null;\n if (nativeData) {\n for (var _i = 0, _Object$entries = Object.entries(nativeData); _i < _Object$entries.length; _i++) {\n var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),\n key = _Object$entries$_i[0],\n data = _Object$entries$_i[1];\n event.dataTransfer.setData(key, data !== null && data !== void 0 ? data : '');\n }\n }\n\n /**\n * 📱 For Android devices, a drag operation will not start unless\n * \"text/plain\" or \"text/uri-list\" data exists in the native data store\n * https://twitter.com/alexandereardon/status/1732189803754713424\n *\n * Tested on:\n * Device: Google Pixel 5\n * Android version: 14 (November 5, 2023)\n * Chrome version: 120.0\n */\n if (isAndroid() && !event.dataTransfer.types.includes(textMediaType) && !event.dataTransfer.types.includes(URLMediaType)) {\n event.dataTransfer.setData(textMediaType, androidFallbackText);\n }\n\n /**\n * 1. Must set any media type for `iOS15` to work\n * 2. We are also doing adding data so that the native adapter\n * can know that the element adapter has handled this drag\n *\n * We used to wrap this `setData()` in a `try/catch` for Firefox,\n * but it looks like that was not needed.\n *\n * Tested using: https://codesandbox.io/s/checking-firefox-throw-behaviour-on-dragstart-qt8h4f\n *\n * - ✅ Firefox@70.0 (Oct 2019) on macOS Sonoma\n * - ✅ Firefox@70.0 (Oct 2019) on macOS Big Sur\n * - ✅ Firefox@70.0 (Oct 2019) on Windows 10\n *\n * // just checking a few more combinations to be super safe\n *\n * - ✅ Chrome@78 (Oct 2019) on macOS Big Sur\n * - ✅ Chrome@78 (Oct 2019) on Windows 10\n * - ✅ Safari@14.1 on macOS Big Sur\n */\n event.dataTransfer.setData(elementAdapterNativeDataKey, '');\n var payload = {\n element: entry.element,\n dragHandle: (_entry$dragHandle2 = entry.dragHandle) !== null && _entry$dragHandle2 !== void 0 ? _entry$dragHandle2 : null,\n data: (_entry$getInitialData3 = (_entry$getInitialData4 = entry.getInitialData) === null || _entry$getInitialData4 === void 0 ? void 0 : _entry$getInitialData4.call(entry, feedback)) !== null && _entry$getInitialData3 !== void 0 ? _entry$getInitialData3 : {}\n };\n var dragType = {\n type: 'element',\n payload: payload,\n startedFrom: 'internal'\n };\n api.start({\n event: event,\n dragType: dragType\n });\n }\n }));\n },\n dispatchEventToSource: function dispatchEventToSource(_ref) {\n var _draggableRegistry$ge, _draggableRegistry$ge2;\n var eventName = _ref.eventName,\n payload = _ref.payload;\n // During a drag operation, a draggable can be:\n // - remounted with different functions\n // - removed completely\n // So we need to get the latest entry from the registry in order\n // to call the latest event functions\n\n (_draggableRegistry$ge = draggableRegistry.get(payload.source.element)) === null || _draggableRegistry$ge === void 0 || (_draggableRegistry$ge2 = _draggableRegistry$ge[eventName]) === null || _draggableRegistry$ge2 === void 0 || _draggableRegistry$ge2.call(_draggableRegistry$ge,\n // I cannot seem to get the types right here.\n // TS doesn't seem to like that one event can need `nativeSetDragImage`\n // @ts-expect-error\n payload);\n },\n onPostDispatch: honeyPotFix.getOnPostDispatch()\n});\nexport var dropTargetForElements = adapter.dropTarget;\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var monitorForElements = adapter.monitor;\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function draggable(args) {\n // Guardrail: warn if the drag handle is not contained in draggable element\n if (process.env.NODE_ENV !== 'production') {\n if (args.dragHandle && !args.element.contains(args.dragHandle)) {\n // eslint-disable-next-line no-console\n console.warn('Drag handle element must be contained in draggable element', {\n element: args.element,\n dragHandle: args.dragHandle\n });\n }\n }\n // Guardrail: warn if the draggable element is already registered\n if (process.env.NODE_ENV !== 'production') {\n var existing = draggableRegistry.get(args.element);\n if (existing) {\n // eslint-disable-next-line no-console\n console.warn('You have already registered a `draggable` on the same element', {\n existing: existing,\n proposed: args\n });\n }\n }\n var cleanup = combine(\n // making the draggable register the adapter rather than drop targets\n // this is because you *must* have a draggable element to start a drag\n // but you _might_ not have any drop targets immediately\n // (You might create drop targets async)\n adapter.registerUsage(), addToRegistry(args), addAttribute(args.element, {\n attribute: 'draggable',\n value: 'true'\n }));\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n}\n\n/** Common event payload for all events */\n\n/** A map containing payloads for all events */\n\n/** Common event payload for all drop target events */\n\n/** A map containing payloads for all events on drop targets */\n\n/** Arguments given to all feedback functions (eg `canDrag()`) on for a `draggable()` */\n\n/** Arguments given to all feedback functions (eg `canDrop()`) on a `dropTargetForElements()` */\n\n/** Arguments given to all monitor feedback functions (eg `canMonitor()`) for a `monitorForElements` */","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { monitorForElements } from '../../../adapter/element-adapter';\nimport { isSafari } from '../../../util/is-safari';\nimport { maxZIndex } from '../../../util/max-z-index';\nimport { popoverResetUserAgentStyles } from '../../../util/popover-reset-styles';\nimport { supportsPopover } from '../../../util/supports-popover';\n\n/** A function to remove the element that has been added to the `container`.\n * @example () => root.unmount()\n */\n\n/** A function that will render a preview element into a `container` `HTMLElement` */\n\n/** By default we use the build in values for the native drag preview: {x: 0, y: 0} */\nfunction defaultOffset() {\n return {\n x: 0,\n y: 0\n };\n}\n\n/** This function provides the ability to mount an element for it to be used as the native drag preview\n *\n * @example\n * draggable({\n * onGenerateDragPreview: ({ nativeSetDragImage }) => {\n * setCustomNativeDragPreview({\n * render: ({ container }) => {\n * const root = createRoot(container);\n * root.render(<Preview item={item} />);\n * return () => root.unmount();\n * },\n * nativeSetDragImage,\n * });\n * },\n * });\n */\nexport function setCustomNativeDragPreview(_ref) {\n var render = _ref.render,\n nativeSetDragImage = _ref.nativeSetDragImage,\n _ref$getOffset = _ref.getOffset,\n getOffset = _ref$getOffset === void 0 ? defaultOffset : _ref$getOffset;\n var container = document.createElement('div');\n\n // Using popover=\"manual\" to place the element in the browser's top layer.\n // This ensures the drag preview container is visually on top of everything else,\n // including elements using z-index and other stacking contexts.\n // \"manual\" means no light dismiss — we manage the lifecycle ourselves.\n // This element is only created for a single frame for the browser to take a\n // photo of it, and then it is destroyed.\n // Falls back to position:fixed + maxZIndex when the popover API is not available.\n // Note: the popover attribute must be set before the element is in the DOM.\n // `.showPopover()` is called further below after the element is appended to the body.\n if (supportsPopover()) {\n container.setAttribute('popover', 'manual');\n }\n Object.assign(container.style, _objectSpread(_objectSpread({\n // Ensuring we don't cause reflow when adding the element to the page\n // Using `position:fixed` rather than `position:absolute` so we are\n // positioned on the current viewport.\n // `position:fixed` also creates a new stacking context, so we don't need to do that here\n position: 'fixed'\n }, supportsPopover() ?\n // needs to come first as it has 'inset: unset' which\n // needs to be overridden by our top / left values\n popoverResetUserAgentStyles : {\n // Fallback: using maximum possible z-index so that this element\n // will always be on top of other positioned content.\n zIndex: maxZIndex\n }), {}, {\n // According to `mdn`, the element can be offscreen:\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage#imgelement\n //\n // However, that information does not appear in the specs:\n // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-setdragimage-dev\n //\n // If the element is _completely_ offscreen, Safari@17.1 will cancel the drag\n top: 0,\n left: 0,\n // Avoiding any additional events caused by the new element (being super safe)\n pointerEvents: 'none'\n }));\n document.body.append(container);\n\n // `.showPopover()` must be called after the element is in the DOM.\n if (supportsPopover()) {\n container.showPopover();\n }\n var unmount = render({\n container: container\n });\n\n /**\n * Some frameworks (eg `react`) don't render into the container until the next microtask.\n * - This will run before the browser takes it's picture of the element\n * - This will run before the animation frame that removes `container`.\n * */\n\n queueMicrotask(function () {\n var previewOffset = getOffset({\n container: container\n });\n\n /**\n * **Problem**\n * On `Safari@17.1` if a drag preview element has some opacity,\n * Safari will include elements behind the drag preview element\n * in the drag preview.\n * Bug: https://bugs.webkit.org/show_bug.cgi?id=266025\n *\n * **Fix**\n * We push the drag preview so it is _almost_ completely offscreen so that\n * there won't be any elements behind the drag preview element.\n * If the element is _completely_ offscreen, then the drag is cancelled by Safari.\n *\n * Using `-0.0001` so that any potential \"see through\" on the drag preview element\n * is effectively invisible 👻\n *\n * **Unsuccessful alternatives**\n * Setting a background color (eg \"white\") on the `container`\n * → Wrecks the opacity of the drag preview element\n *\n * Adding a parent element of the `container` with a background color (eg \"white\")\n * → Wrecks the opacity of the drag preview element\n */\n /**\n * Update: this bug fix is no longer needed in `Safari@26.4` (and maybe earlier)\n * We can remove it in a future release\n */\n if (isSafari()) {\n var rect = container.getBoundingClientRect();\n\n // We cannot apply this fix if nothing has been rendered into the `container`\n if (rect.width === 0) {\n return;\n }\n container.style.left = \"-\".concat(rect.width - 0.0001, \"px\");\n }\n nativeSetDragImage === null || nativeSetDragImage === void 0 || nativeSetDragImage(container, previewOffset.x, previewOffset.y);\n });\n function cleanup() {\n // No need to call `.hidePopover()`.\n // Removing the element from the DOM dismisses the popover\n unbindMonitor();\n unmount === null || unmount === void 0 || unmount();\n document.body.removeChild(container);\n }\n var unbindMonitor = monitorForElements({\n // Remove portal in the dragstart event so that the user will never see it\n onDragStart: cleanup,\n // Backup: remove portal when the drop finishes (this would be an error case)\n onDrop: cleanup\n });\n}","export function preserveOffsetOnSource(_ref) {\n var element = _ref.element,\n input = _ref.input;\n return function getOffset(_ref2) {\n var container = _ref2.container;\n /**\n * **Android**\n *\n * This function won't do anything 😅.\n * The drag preview will _always_ be under the center of the users pointer.\n * There is no harm in calling this function though 🧘.\n *\n * **iOS and iPadOS**\n *\n * The drag preview is lifted in the expected position and then slides under\n * the users pointer.\n * This is more pleasing than immediately putting the center of the drag preview\n * under the users pointer.\n * With this function the drag preview looks like it is popping out\n * of the UI and then it shifts under the users pointer as the drag is occurring ✨\n */\n\n var sourceRect = element.getBoundingClientRect();\n var containerRect = container.getBoundingClientRect();\n var offsetX = Math.min(\n // difference\n input.clientX - sourceRect.x,\n // don't let the difference be more than the width of the container,\n // otherwise the pointer will be off the preview\n containerRect.width);\n var offsetY = Math.min(\n // difference\n input.clientY - sourceRect.y,\n // don't let the difference be more than the height of the container,\n // otherwise the pointer will be off the preview\n containerRect.height);\n return {\n x: offsetX,\n y: offsetY\n };\n };\n}","/**\n * Arrastre de eventos en timeGrid sobre pragmatic-drag-and-drop.\n *\n * Sustituye al controlador por puntero SOLO para MOVER. El redimensionado por\n * los bordes sigue en `startEventDrag`: pdnd resuelve drag-and-drop, no resize.\n *\n * Lo que aporta frente al anterior: cada columna es un drop target, asi que\n * mover una cita a OTRO DIA en semana y semana laboral sale del propio modelo\n * en vez de tener que resolverlo a mano. El delta de minutos se sigue\n * calculando con la geometria del nucleo, a partir de la posicion del puntero\n * dentro de la columna destino.\n *\n * pdnd se apoya en el drag and drop NATIVO de HTML5, de ahi que la vista previa\n * se configure con `setCustomNativeDragPreview` y no moviendo el elemento.\n */\nimport {\n draggable,\n dropTargetForElements,\n monitorForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter\";\nimport { setCustomNativeDragPreview } from \"@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview\";\nimport { preserveOffsetOnSource } from \"@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source\";\nimport { dl, timeStringToMinutes, type CalendarApi, type EventDef } from \"@reservi/core\";\n\nimport type { RsvDate, TimeGridModel } from \"@reservi/core\";\n\n/**\n * Instante del ultimo arrastre. Tras soltar, el navegador dispara ademas un\n * `click`: sin este guard ese click abre el detalle de la cita (si cae sobre el\n * evento) y crea un borrador (si cae sobre la columna), justo despues de\n * haberla movido. No hay forma fiable de distinguir ese click sintetico del de\n * un usuario, asi que se ignoran los que llegan pegados a un arrastre.\n */\nlet instanteUltimoArrastre = 0;\n\n/** Anota que se acaba de arrastrar. */\nexport function marcarArrastre(): void {\n instanteUltimoArrastre = Date.now();\n}\n\n/** ¿Acaba de terminar un arrastre? Los clicks de esa ventana se descartan. */\nexport function arrastreReciente(ventanaMs = 300): boolean {\n return Date.now() - instanteUltimoArrastre < ventanaMs;\n}\n\n/** Marca los datos que viajan en el arrastre, para no confundir origenes. */\nconst TIPO_EVENTO = \"rsv-timegrid-event\";\nconst TIPO_COLUMNA = \"rsv-timegrid-col\";\n\nexport interface RangoPreview {\n dayIndex: number;\n startMin: number;\n endMin: number;\n}\n\n/** Hace arrastrable la tarjeta de un evento. Devuelve la limpieza. */\nexport function hacerEventoArrastrable(\n el: HTMLElement,\n event: EventDef,\n editable: boolean,\n): () => void {\n if (!editable) return () => {};\n return draggable({\n element: el,\n getInitialData: () => ({ [TIPO_EVENTO]: true, id: event.id }),\n onGenerateDragPreview({ location, nativeSetDragImage }) {\n // La vista previa nativa conserva el punto exacto donde se agarro la\n // tarjeta; sin esto el navegador la centra bajo el cursor y el gesto se\n // siente descolocado en franjas altas.\n setCustomNativeDragPreview({\n nativeSetDragImage,\n getOffset: preserveOffsetOnSource({ element: el, input: location.current.input }),\n render({ container }) {\n const copia = el.cloneNode(true) as HTMLElement;\n copia.setAttribute(\"data-rsv-drag-preview\", \"true\");\n copia.style.width = `${el.offsetWidth}px`;\n copia.style.height = `${el.offsetHeight}px`;\n container.appendChild(copia);\n },\n });\n },\n });\n}\n\n/**\n * Registra una columna como destino de sueltas. Devuelve la limpieza.\n *\n * Solo viaja el INDICE de la columna, leido del DOM al soltar. Ni se captura en\n * el registro (Preact reutiliza el elemento al navegar de semana, y el valor se\n * quedaria apuntando a la anterior) ni se manda la fecha como texto: quien\n * necesite el dia lo toma del modelo por este indice, porque una ida y vuelta\n * por `dl.toISOString`/`dl.from` devuelve la hora actual.\n */\nexport function hacerColumnaDestino(el: HTMLElement): () => void {\n return dropTargetForElements({\n element: el,\n canDrop: ({ source }) => source.data[TIPO_EVENTO] === true,\n getData: ({ element }) => ({\n [TIPO_COLUMNA]: true,\n dayIndex: Number((element as HTMLElement).dataset.rsvDayIndex ?? 0),\n }),\n });\n}\n\ninterface OpcionesMonitor {\n api: CalendarApi;\n /**\n * Getter, no valor: el modelo cambia al navegar de semana y un modelo\n * capturado en el registro dejaria de corresponder con lo que se ve.\n */\n getModel: () => TimeGridModel;\n snap?: string | undefined;\n /** Rango destino en curso; `null` al terminar. */\n onPreview: (rango: RangoPreview | null) => void;\n /** Id del evento que se esta arrastrando; `null` al terminar. */\n onDragging: (id: string | null) => void;\n}\n\n/** Minutos del dia bajo el puntero dentro de una columna. Exportada para test. */\nexport function minutosEnColumna(\n columnaEl: HTMLElement,\n clientY: number,\n model: TimeGridModel,\n snapMin: number,\n): number {\n const rect = columnaEl.getBoundingClientRect();\n const total = model.maxMinutes - model.minMinutes;\n if (rect.height === 0 || total <= 0) return model.minMinutes;\n const crudo = model.minMinutes + ((clientY - rect.top) / rect.height) * total;\n const acotado = Math.max(model.minMinutes, Math.min(model.maxMinutes, crudo));\n return Math.round(acotado / snapMin) * snapMin;\n}\n\n/**\n * Minutos de `desde` a `hasta`, positivos si `hasta` es posterior.\n *\n * `dl.diff(a, b)` devuelve `b - a`, al reves de lo que sugiere el orden de los\n * argumentos. Usarlo directamente movia los eventos en direccion contraria, asi\n * que se encapsula aqui una sola vez en lugar de recordar la convencion en cada\n * llamada.\n */\nfunction duracionMin(desde: RsvDate, hasta: RsvDate): number {\n return dl.diff(desde, hasta, \"minute\");\n}\n\n/**\n * Nuevo rango del evento al soltarlo en `dia` a `minutosEnDia` del dia.\n *\n * Devuelve `null` si no hay cambio real. La duracion se conserva: el fin se\n * desplaza lo mismo que el inicio.\n */\nexport function calcularDestino(\n dia: RsvDate,\n minutosEnDia: number,\n event: { start: RsvDate; end: RsvDate | null },\n): { start: RsvDate; end: RsvDate | null } | null {\n const nuevoInicio = dl.add(dl.startOf(dia, \"day\"), { minutes: minutosEnDia });\n // Sin cambio: nada que aplicar.\n if (duracionMin(nuevoInicio, event.start) === 0) return null;\n const duracion = event.end ? duracionMin(event.start, event.end) : 0;\n return {\n start: nuevoInicio,\n end: event.end ? dl.add(nuevoInicio, { minutes: duracion }) : null,\n };\n}\n\n/**\n * Escucha los arrastres de eventos de timeGrid y aplica el movimiento al\n * soltar. Devuelve la limpieza.\n */\nexport function monitorizarArrastres({\n api,\n getModel,\n snap,\n onPreview,\n onDragging,\n}: OpcionesMonitor): () => void {\n const snapMin = timeStringToMinutes(snap ?? \"00:15\") || 15;\n\n /** Destino bajo el puntero, o null si no hay columna valida. */\n const destino = (location: {\n current: {\n input: { clientY: number };\n dropTargets: readonly { element: Element; data: Record<string, unknown> }[];\n };\n }) => {\n const target = location.current.dropTargets.find((t) => t.data[TIPO_COLUMNA] === true);\n if (!target) return null;\n const inicio = minutosEnColumna(\n target.element as HTMLElement,\n location.current.input.clientY,\n getModel(),\n snapMin,\n );\n return { target, inicio };\n };\n\n return monitorForElements({\n canMonitor: ({ source }) => source.data[TIPO_EVENTO] === true,\n onDragStart: ({ source }) => {\n marcarArrastre();\n onDragging(String(source.data.id));\n },\n onDrag: ({ source, location }) => {\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n const duracion = event.end ? Math.max(snapMin, duracionMin(event.start, event.end)) : snapMin;\n onPreview({\n dayIndex: Number(d.target.data.dayIndex),\n startMin: d.inicio,\n endMin: d.inicio + duracion,\n });\n },\n onDrop: ({ source, location }) => {\n marcarArrastre();\n onPreview(null);\n onDragging(null);\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n\n // El destino se compone de dos partes: el dia lo da la columna, la hora\n // la posicion del puntero dentro de ella.\n //\n // El dia se toma del MODELO por su indice, no parseando `data-date`:\n // `dl.toISOString` produce una fecha terminada en `Z` y `dl.from` devuelve\n // la HORA ACTUAL ante ese formato, asi que la ida y vuelta por texto\n // resolvia siempre a hoy y el movimiento entre dias no se aplicaba.\n const dia = getModel().days[Number(d.target.data.dayIndex)]?.date;\n if (!dia) return;\n const siguiente = calcularDestino(dia, d.inicio, event);\n if (!siguiente) return;\n\n if (api.moveEvent(event.id, siguiente.start, siguiente.end)) {\n const actualizado = api.getEventById(event.id);\n if (actualizado) api.trigger(\"eventDrop\", { event: actualizado });\n }\n },\n });\n}\n","/**\n * Arrastre de eventos entre dias en dayGrid/mes, sobre pragmatic-drag-and-drop.\n *\n * Hermano de `pdnd-timegrid`, con dos diferencias propias del mes: el destino es\n * una CELDA DE DIA (no una columna con hora), y el movimiento conserva la hora\n * del evento — solo cambia la fecha.\n *\n * Comparte con el timeGrid el `draggable` de la tarjeta, para que la elevacion y\n * la vista previa nativa se vean igual en las dos vistas.\n */\nimport {\n dropTargetForElements,\n monitorForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter\";\nimport { dl, type CalendarApi, type RsvDate } from \"@reservi/core\";\n\nimport { marcarArrastre } from \"./pdnd-timegrid.js\";\n\nconst TIPO_EVENTO = \"rsv-timegrid-event\";\nconst TIPO_DIA = \"rsv-daygrid-day\";\n\n/**\n * Nuevo rango al soltar el evento en `dia`, conservando su hora.\n *\n * Devuelve `null` si cae en el mismo dia. Se desplaza por dias completos, asi\n * que la hora y la duracion quedan intactas.\n */\nexport function calcularDestinoDia(\n dia: RsvDate,\n event: { start: RsvDate; end: RsvDate | null },\n): { start: RsvDate; end: RsvDate | null } | null {\n // `dl.diff(a, b)` devuelve `b - a`: el orden importa y ya nos costo un bug.\n const dias = dl.diff(dl.startOf(event.start, \"day\"), dl.startOf(dia, \"day\"), \"day\");\n if (dias === 0) return null;\n return {\n start: dl.add(event.start, { days: dias }),\n end: event.end ? dl.add(event.end, { days: dias }) : null,\n };\n}\n\n/** Registra una celda de dia como destino. Devuelve la limpieza. */\nexport function hacerDiaDestino(el: HTMLElement): () => void {\n return dropTargetForElements({\n element: el,\n canDrop: ({ source }) => source.data[TIPO_EVENTO] === true,\n // Sin capturas: la fecha se lee del DOM al soltar, porque Preact reutiliza\n // la celda al navegar de mes.\n getData: ({ element }) => ({\n [TIPO_DIA]: true,\n fechaISO: (element as HTMLElement).dataset.date ?? \"\",\n }),\n });\n}\n\ninterface OpcionesMonitor {\n api: CalendarApi;\n /** Dia destino en curso (ISO), o `null` al terminar. */\n onPreview: (fechaISO: string | null) => void;\n onDragging: (id: string | null) => void;\n}\n\n/** Escucha los arrastres del mes y aplica el cambio de dia. Devuelve la limpieza. */\nexport function monitorizarArrastresDia({\n api,\n onPreview,\n onDragging,\n}: OpcionesMonitor): () => void {\n const destino = (location: {\n current: { dropTargets: readonly { data: Record<string, unknown> }[] };\n }) => location.current.dropTargets.find((t) => t.data[TIPO_DIA] === true) ?? null;\n\n return monitorForElements({\n canMonitor: ({ source }) => source.data[TIPO_EVENTO] === true,\n onDragStart: ({ source }) => {\n marcarArrastre();\n onDragging(String(source.data.id));\n },\n onDrag: ({ location }) => {\n const d = destino(location);\n onPreview(d ? String(d.data.fechaISO) : null);\n },\n onDrop: ({ source, location }) => {\n marcarArrastre();\n onPreview(null);\n onDragging(null);\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n\n const siguiente = calcularDestinoDia(dl.from(String(d.data.fechaISO)), event);\n if (!siguiente) return;\n if (api.moveEvent(event.id, siguiente.start, siguiente.end)) {\n const actualizado = api.getEventById(event.id);\n if (actualizado) api.trigger(\"eventDrop\", { event: actualizado });\n }\n },\n });\n}\n","import {\n dl,\n getLocaleText,\n type CalendarApi,\n type DayGridCell,\n type DayGridModel,\n type EventDef,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport { dateFormatter, timeFormatter } from \"../../render/format.js\";\nimport { navLinkToDay } from \"../../render/nav.js\";\nimport { handleEventKeydown } from \"../../interaction/keyboard.js\";\nimport { startDayRangeSelect } from \"../../interaction/daygrid-drag.js\";\nimport { hacerEventoArrastrable } from \"../../interaction/pdnd-timegrid.js\";\nimport { hacerDiaDestino, monitorizarArrastresDia } from \"../../interaction/pdnd-daygrid.js\";\n\ninterface DayGridViewProps {\n api: CalendarApi;\n model: DayGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de cuadrícula por días (mes/semana/día/año). */\nexport function DayGridView({ api, model, options }: DayGridViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const dowFmt = dateFormatter(locale, options.dayHeaderFormat, { weekday: \"short\" });\n const headerDays = model.weeks[0]?.days ?? [];\n const showWeekNums = options.weekNumbers === true;\n\n const [diaDestino, setDiaDestino] = useState<string | null>(null);\n const [idArrastrado, setIdArrastrado] = useState<string | null>(null);\n const limpiezaDias = useRef(new Map<HTMLElement, () => void>());\n\n // Un unico monitor para toda la vista, igual que en timeGrid.\n useEffect(\n () => monitorizarArrastresDia({ api, onPreview: setDiaDestino, onDragging: setIdArrastrado }),\n [api],\n );\n useEffect(() => {\n const mapa = limpiezaDias.current;\n return () => {\n for (const limpiar of mapa.values()) limpiar();\n mapa.clear();\n };\n }, []);\n\n return (\n <div\n data-rsv=\"daygrid\"\n data-weeknumbers={String(showWeekNums)}\n style={`--rsv-cols:${model.columnCount}`}\n >\n <div data-rsv=\"daygrid-header\" role=\"row\">\n {showWeekNums && <div data-rsv=\"daygrid-weeknum-header\" role=\"columnheader\" />}\n {headerDays.map((cell) => {\n const date = dl.toDate(cell.date);\n const text = dowFmt ? dowFmt(date) : \"\";\n const headerArg = {\n date,\n text,\n dayOfWeek: cell.dayOfWeek,\n dayNumber: dl.dayOfMonth(cell.date),\n isToday: cell.isToday,\n view,\n };\n return (\n <div\n data-rsv=\"daygrid-dow\"\n role=\"columnheader\"\n data-dow={String(cell.dayOfWeek)}\n class={cx(options.classNames?.dayHeader)}\n key={cell.dayOfWeek}\n ref={(el) => callDidMount(el, options.hooks?.dayHeaderDidMount, () => headerArg)}\n >\n {renderSlot(options.slots?.dayHeaderContent, headerArg, text, options.hostBridge)}\n </div>\n );\n })}\n </div>\n\n {model.weeks.map((week, wi) => (\n <div data-rsv=\"daygrid-week\" role=\"row\" key={wi}>\n {showWeekNums && (\n <div data-rsv=\"daygrid-weeknum\" role=\"rowheader\">\n {week.weekNumber}\n </div>\n )}\n {week.days.map((cell) => (\n <DayCell\n api={api}\n cell={cell}\n options={options}\n view={view}\n key={dl.toISOString(cell.date)}\n dropActivo={diaDestino === dl.toISOString(cell.date)}\n limpiezaDias={limpiezaDias}\n idArrastrado={idArrastrado}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction DayCell({\n api,\n cell,\n options,\n view,\n dropActivo,\n limpiezaDias,\n idArrastrado,\n}: {\n api: CalendarApi;\n cell: DayGridCell;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** Este dia es el destino bajo el puntero durante un arrastre. */\n dropActivo: boolean;\n /** Registro de limpiezas de los drop targets, compartido por la vista. */\n limpiezaDias: { current: Map<HTMLElement, () => void> };\n /** Evento que se esta arrastrando, para elevarlo con CSS. */\n idArrastrado: string | null;\n}): VNode {\n const date = dl.toDate(cell.date);\n const dayNumber = dl.dayOfMonth(cell.date);\n const defaultNumber = options.navLinks ? (\n <a\n data-rsv=\"day-number\"\n data-nav-link=\"true\"\n role=\"link\"\n tabIndex={0}\n title={getLocaleText(options.locale).navLinkHint(\n new Intl.DateTimeFormat(options.locale, { dateStyle: \"long\" }).format(date),\n )}\n onClick={(e) => {\n e.stopPropagation();\n navLinkToDay(api, cell.date);\n }}\n >\n {dayNumber}\n </a>\n ) : (\n <span data-rsv=\"day-number\">{dayNumber}</span>\n );\n const cellArg = { date, dayNumber, isToday: cell.isToday, isOther: cell.isOther, view };\n const numberNode = renderSlot(\n options.slots?.dayCellContent,\n cellArg,\n defaultNumber,\n options.hostBridge,\n );\n\n const [moreOpen, setMoreOpen] = useState(false);\n\n const dateStr = dl.toISOString(cell.date);\n const rangeSelectedRef = useRef(false);\n\n const onDayClick = () => {\n // Suprime el click que sigue a una selección por arrastre.\n if (rangeSelectedRef.current) {\n rangeSelectedRef.current = false;\n return;\n }\n // `cell.isBusiness` ya viene del modelo; no hace falta resolver el horario aquí.\n if (options.selectConstraint === \"businessHours\" && !cell.isBusiness) return;\n api.trigger(\"dateClick\", { date: cell.date });\n if (options.selectable) {\n api.select(dateStr, dl.toISOString(dl.add(cell.date, { days: 1 })));\n }\n };\n\n const openMore = (e: Event) => {\n e.stopPropagation();\n setMoreOpen(true);\n api.trigger(\"moreLinkClick\", {\n date: cell.date,\n allEvents: [...cell.events, ...cell.hiddenEvents],\n hiddenEvents: cell.hiddenEvents,\n });\n };\n\n return (\n <div\n data-rsv=\"day\"\n role=\"gridcell\"\n data-date={dateStr}\n data-rsv-drop={dropActivo ? \"true\" : undefined}\n data-today={String(cell.isToday)}\n data-other={String(cell.isOther)}\n data-weekend={String(cell.isWeekend)}\n data-business={String(cell.isBusiness)}\n data-selected={String(cell.isSelected)}\n class={cx(options.classNames?.day)}\n ref={(el) => {\n callDidMount(el, options.hooks?.dayCellDidMount, () => cellArg);\n // Preact llama a los refs en CADA render: sin la guarda se acumularian\n // registros de drop target sobre el mismo elemento.\n if (!el || limpiezaDias.current.has(el)) return;\n limpiezaDias.current.set(el, hacerDiaDestino(el));\n }}\n onClick={onDayClick}\n onPointerDown={\n options.selectable\n ? (e) =>\n startDayRangeSelect(e, {\n api,\n startDate: dateStr,\n onRangeSelect: () => {\n rangeSelectedRef.current = true;\n },\n })\n : undefined\n }\n >\n {numberNode}\n {cell.events\n .filter((event) => event.display !== \"none\")\n .map((event) => (\n <EventChip\n api={api}\n event={event}\n options={options}\n view={view}\n arrastrandose={idArrastrado === event.id}\n key={event.id}\n />\n ))}\n {cell.moreCount > 0 && (\n <div data-rsv=\"more-anchor\">\n <button type=\"button\" data-rsv=\"more-link\" onClick={openMore}>\n {renderSlot(\n options.slots?.moreLinkContent,\n {\n date,\n moreCount: cell.moreCount,\n allEvents: [...cell.events, ...cell.hiddenEvents],\n hiddenEvents: cell.hiddenEvents,\n view,\n },\n getLocaleText(options.locale).more(cell.moreCount),\n options.hostBridge,\n )}\n </button>\n {moreOpen && (\n <DayMorePopover\n api={api}\n cell={cell}\n options={options}\n view={view}\n onClose={() => setMoreOpen(false)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Popover de \"+N more\": lista todos los eventos del día (visibles + ocultos). */\nfunction DayMorePopover({\n api,\n cell,\n options,\n view,\n onClose,\n}: {\n api: CalendarApi;\n cell: DayGridCell;\n options: ReserviCalendarOptions;\n view: ViewArg;\n onClose: () => void;\n}): VNode {\n const ref = useRef<HTMLDivElement>(null);\n const dayFmt = new Intl.DateTimeFormat(options.locale ?? \"en\", {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n const allEvents = [...cell.events, ...cell.hiddenEvents].filter((e) => e.display !== \"none\");\n\n useEffect(() => {\n const onPointer = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointer);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [onClose]);\n\n return (\n <div data-rsv=\"more-popover\" role=\"dialog\" ref={ref} onClick={(e) => e.stopPropagation()}>\n <div data-rsv=\"more-popover-header\">\n <span data-rsv=\"more-popover-title\">{dayFmt.format(dl.toDate(cell.date))}</span>\n <button type=\"button\" data-rsv=\"more-popover-close\" aria-label=\"✕\" onClick={onClose}>\n ✕\n </button>\n </div>\n <div data-rsv=\"more-popover-body\">\n {allEvents.map((event) => (\n <EventChip\n api={api}\n event={event}\n options={options}\n view={view}\n arrastrandose={false}\n key={event.id}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction EventChip({\n api,\n event,\n options,\n view,\n arrastrandose,\n}: {\n api: CalendarApi;\n event: EventDef;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** Se esta arrastrando ahora mismo, para elevarlo con CSS. */\n arrastrandose: boolean;\n}): VNode {\n const editable = options.editable === true && event.editable !== false;\n /** Mover entre dias es un permiso aparte del de redimensionar. */\n // Nota: `EventInput.startEditable` existe en el tipo publico pero\n // `normalizeEvent` no lo traslada a `EventDef`, asi que por ahora el permiso\n // por evento no se puede afinar; solo el global.\n const arrastrable = editable && options.eventDraggable === true;\n const limpiarArrastre = useRef<(() => void) | null>(null);\n const nodoArrastre = useRef<HTMLElement | null>(null);\n useEffect(() => () => limpiarArrastre.current?.(), []);\n const selected = api.selectedEventIds.value.has(event.id);\n const draggedRef = useRef(false);\n const eventFmt = timeFormatter(options.locale ?? \"en\", options.eventTimeFormat);\n const timeText = event.allDay\n ? \"\"\n : eventFmt\n ? eventFmt(dl.toDate(event.start))\n : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: event.allDay, timeText, view };\n const content = renderSlot(\n options.slots?.eventContent,\n contentArg,\n <span data-rsv=\"event-title\">\n {timeText ? `${timeText} ` : \"\"}\n {event.title}\n </span>,\n options.hostBridge,\n );\n\n return (\n <div\n data-rsv=\"event\"\n role=\"button\"\n tabIndex={0}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-all-day={String(event.allDay)}\n data-display={event.display}\n data-event-id={event.id}\n data-editable={String(editable)}\n data-rsv-selected={String(selected)}\n data-rsv-dragging={arrastrandose ? \"true\" : undefined}\n ref={(el) => {\n callDidMount(el, options.hooks?.eventDidMount, () => contentArg);\n // Solo si cambia el NODO: Preact llama a los refs en cada render y\n // recrear el `draggable` a mitad del gesto lo cancelaria.\n if (el === nodoArrastre.current) return;\n limpiarArrastre.current?.();\n nodoArrastre.current = el;\n limpiarArrastre.current = el ? hacerEventoArrastrable(el, event, arrastrable) : null;\n }}\n style={\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n // Suprime el click que sigue a un arrastre.\n if (draggedRef.current) {\n draggedRef.current = false;\n return;\n }\n // Ctrl/Cmd-click: alterna selección múltiple (bulk ops) en vez de eventClick.\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n onKeyDown={\n editable\n ? (e) =>\n handleEventKeydown(e, {\n api,\n event,\n kind: \"dayGrid\",\n shortcuts: options.keyboardShortcuts,\n })\n : undefined\n }\n >\n {content}\n </div>\n );\n}\n","/**\n * Auto-scroll de un contenedor scrolleable mientras el puntero está cerca de\n * su borde superior/inferior durante un drag. `update()` se llama en cada\n * `pointermove`; el propio scroll corre por rAF mientras el drag sigue activo.\n */\nconst EDGE_PX = 40;\nconst MAX_SPEED_PX = 16;\n\nexport interface AutoScroller {\n /** Llamar en cada pointermove con la posición Y actual del puntero. */\n update(clientY: number): void;\n /** Total de px que el auto-scroll desplazó el contenedor (sumar al delta del drag). */\n getScrolled(): number;\n /** Detener el loop (llamar en pointerup/pointercancel). */\n stop(): void;\n}\n\nconst NOOP_SCROLLER: AutoScroller = {\n update() {},\n getScrolled: () => 0,\n stop() {},\n};\n\nexport function startAutoScroll(container: HTMLElement | null): AutoScroller {\n if (!container) return NOOP_SCROLLER;\n\n let lastY = 0;\n let scrolled = 0;\n let raf = 0;\n\n const tick = (): void => {\n const rect = container.getBoundingClientRect();\n let delta = 0;\n if (lastY < rect.top + EDGE_PX) {\n delta = -MAX_SPEED_PX * (1 - Math.max(0, lastY - rect.top) / EDGE_PX);\n } else if (lastY > rect.bottom - EDGE_PX) {\n delta = MAX_SPEED_PX * (1 - Math.max(0, rect.bottom - lastY) / EDGE_PX);\n }\n if (delta !== 0) {\n const before = container.scrollTop;\n container.scrollTop += delta;\n scrolled += container.scrollTop - before; // ya clampeado a los límites de scroll\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n update(clientY) {\n lastY = clientY;\n },\n getScrolled: () => scrolled,\n stop() {\n cancelAnimationFrame(raf);\n },\n };\n}\n","/**\n * Controlador de drag/resize por puntero para timeGrid. Usa la geometría pura\n * del núcleo (testeada en @reservi/core) y mide la columna del DOM para obtener\n * px/min. El cálculo de fechas NO vive aquí (vive en core/interaction).\n */\nimport {\n computeDrop,\n computeResize,\n dl,\n pxToSnappedMinutes,\n timeStringToMinutes,\n type CalendarApi,\n type EventDef,\n type ResizeEdge,\n type RsvDate,\n type TimeGridModel,\n} from \"@reservi/core\";\nimport { startAutoScroll } from \"./auto-scroll.js\";\n\n/** Contenedor scrolleable de timeGrid (ver `[data-rsv=\"tg-body\"]` en TimeGridView). */\nfunction scrollAncestor(el: HTMLElement): HTMLElement | null {\n return el.closest<HTMLElement>('[data-rsv=\"tg-body\"]');\n}\n\ninterface DragOptions {\n api: CalendarApi;\n event: EventDef;\n model: TimeGridModel;\n columnEl: HTMLElement;\n snap?: string | undefined;\n /** Si se indica, redimensiona por ese borde; si no, mueve el evento. */\n edge?: ResizeEdge | undefined;\n /**\n * Se llama en cada movimiento con el rango destino (minutos absolutos del\n * dia), y con `null` al soltar. Sirve para pintar el fantasma que indica\n * donde va a caer el evento; sin esto la tarjeta se queda quieta y salta a su\n * nueva posicion solo al soltar.\n */\n onPreview?: ((range: RangePreview | null) => void) | undefined;\n}\n\nexport function startEventDrag(ev: PointerEvent, options: DragOptions): void {\n ev.preventDefault();\n ev.stopPropagation();\n const { api, event, model, columnEl, snap = \"00:15\", edge, onPreview } = options;\n\n const rect = columnEl.getBoundingClientRect();\n const totalMinutes = model.maxMinutes - model.minMinutes;\n const ppm = rect.height === 0 ? 0 : rect.height / totalMinutes;\n const startY = ev.clientY;\n\n // Auto-scroll del cuerpo de timeGrid al arrastrar cerca de su borde superior/inferior.\n const scroller = startAutoScroll(scrollAncestor(columnEl));\n scroller.update(ev.clientY);\n\n const snapMinArrastre = timeStringToMinutes(snap) || 15;\n\n /** Minutos absolutos del dia de un instante, para situar el fantasma. */\n const aMinutos = (d: Parameters<typeof dl.toDate>[0]): number => {\n const fecha = dl.toDate(d);\n return fecha.getHours() * 60 + fecha.getMinutes();\n };\n\n const onMove = (e: PointerEvent): void => {\n scroller.update(e.clientY);\n if (!onPreview) return;\n const delta = pxToSnappedMinutes(e.clientY - startY + scroller.getScrolled(), ppm, snap);\n const destino = edge\n ? computeResize(event.start, event.end, edge, delta, dl)\n : computeDrop(event.start, event.end, delta, dl);\n const inicio = aMinutos(destino.start);\n const fin = destino.end ? aMinutos(destino.end) : inicio + snapMinArrastre;\n onPreview({ startMin: Math.min(inicio, fin), endMin: Math.max(inicio, fin) });\n };\n const onUp = (e: PointerEvent) => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n scroller.stop();\n onPreview?.(null);\n // Suma el desplazamiento que el propio auto-scroll aplicó al contenedor:\n // el puntero no se movió más, pero el contenido sí, así que cuenta como drag extra.\n const deltaMin = pxToSnappedMinutes(e.clientY - startY + scroller.getScrolled(), ppm, snap);\n if (deltaMin === 0) return;\n\n const next = edge\n ? computeResize(event.start, event.end, edge, deltaMin, dl)\n : computeDrop(event.start, event.end, deltaMin, dl);\n\n // moveEvent valida overlap/constraint/allow; si no es válido, se revierte.\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(edge ? \"eventResize\" : \"eventDrop\", { event: updated });\n }\n };\n\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n\n/** Rango en curso (minutos absolutos del dia) para dibujar el `selectMirror`. */\nexport interface RangePreview {\n startMin: number;\n endMin: number;\n}\n\ninterface RangeSelectOptions {\n api: CalendarApi;\n date: RsvDate;\n model: TimeGridModel;\n columnEl: HTMLElement;\n snap?: string | undefined;\n /**\n * Se llama con el rango en curso mientras se arrastra y con `null` al\n * terminar. La vista lo usa para pintar el \"fantasma\" (`selectMirror`).\n */\n onPreview?: ((range: RangePreview | null) => void) | undefined;\n}\n\n/** Selección de rango horario por arrastre en una columna de timeGrid. */\nexport function startTimeRangeSelect(ev: PointerEvent, options: RangeSelectOptions): void {\n // No iniciar si se pulsa sobre un evento existente.\n if ((ev.target as HTMLElement).closest('[data-rsv=\"event\"]')) return;\n const { api, date, model, columnEl, snap = \"00:15\" } = options;\n\n const total = model.maxMinutes - model.minMinutes;\n const snapMin = timeStringToMinutes(snap) || 15;\n\n // Recalcula la geometría en cada llamada: si el contenedor hizo auto-scroll,\n // `columnEl` cambió de posición y un `rect` capturado una sola vez quedaría obsoleto.\n const yToMin = (clientY: number): number => {\n const rect = columnEl.getBoundingClientRect();\n const ppm = rect.height === 0 ? 0 : rect.height / total;\n const raw = model.minMinutes + (ppm === 0 ? 0 : (clientY - rect.top) / ppm);\n const clamped = Math.max(model.minMinutes, Math.min(model.maxMinutes, raw));\n return Math.round(clamped / snapMin) * snapMin;\n };\n\n const startMin = yToMin(ev.clientY);\n let endMin = startMin;\n let moved = false;\n\n // Auto-scroll del cuerpo de timeGrid al arrastrar cerca de su borde superior/inferior.\n const scroller = startAutoScroll(scrollAncestor(columnEl));\n scroller.update(ev.clientY);\n\n const onMove = (e: PointerEvent): void => {\n scroller.update(e.clientY);\n const m = yToMin(e.clientY);\n if (m !== startMin) moved = true;\n endMin = m;\n if (moved) {\n options.onPreview?.({\n startMin: Math.min(startMin, endMin),\n endMin: Math.max(startMin, endMin),\n });\n }\n };\n const onUp = (): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n scroller.stop();\n options.onPreview?.(null);\n if (!moved) return; // un click simple lo gestiona dateClick\n const lo = Math.min(startMin, endMin);\n const hi = Math.max(startMin, endMin);\n const dayStart = dl.startOf(date, \"day\");\n api.select(\n dl.toISOString(dl.add(dayStart, { minutes: lo })),\n dl.toISOString(dl.add(dayStart, { minutes: hi })),\n );\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n","import {\n dl,\n getLocaleText,\n isWithinBusinessHours,\n resolveBusinessHours,\n timeStringToMinutes,\n type CalendarApi,\n type CalendarViewAdapter,\n type TimeGridModel,\n type TimeGridSeg,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport {\n dateFormatter,\n minutesToLabel,\n minutesToTimeString,\n timeFormatter,\n} from \"../../render/format.js\";\nimport { navLinkToDay } from \"../../render/nav.js\";\nimport { startEventDrag, startTimeRangeSelect } from \"../../interaction/drag.js\";\nimport {\n arrastreReciente,\n hacerColumnaDestino,\n hacerEventoArrastrable,\n monitorizarArrastres,\n} from \"../../interaction/pdnd-timegrid.js\";\nimport { handleEventKeydown } from \"../../interaction/keyboard.js\";\n\ninterface TimeGridViewProps {\n api: CalendarApi;\n model: TimeGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Rango de selección en curso (minutos absolutos del día), para el mirror. */\ninterface PreviewRange {\n dayIndex: number;\n startMin: number;\n endMin: number;\n}\n\n/** Vista con eje temporal vertical (semana/día). */\nexport function TimeGridView({ api, model, options }: TimeGridViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const headerFmt = dateFormatter(locale, options.dayHeaderFormat, {\n weekday: \"short\",\n day: \"numeric\",\n });\n const slotFmt = timeFormatter(locale, options.slotLabelFormat);\n const showAllDay = options.allDaySlot !== false;\n const bodyHeight = `calc(var(--spacing-rsv-slot, 2.5rem) * ${model.slots.length})`;\n const total = model.maxMinutes - model.minMinutes;\n const snapMin =\n timeStringToMinutes(options.snapDuration ?? options.slotDuration ?? \"00:15\") || 15;\n\n // Se resuelve una vez por render y no por columna: el horario es el mismo para\n // toda la vista.\n const horario = resolveBusinessHours(options.businessHours);\n const bloquearFuera = options.selectConstraint === \"businessHours\" && horario !== null;\n\n /** ¿Se puede crear algo en `minutes` del día `dia`? */\n const permiteCrear = (dia: Parameters<typeof dl.startOf>[0], minutes: number): boolean => {\n if (!bloquearFuera) return true;\n const fecha = dl.add(dl.startOf(dia, \"day\"), { minutes });\n return isWithinBusinessHours(fecha, null, horario, dl);\n };\n\n const bodyRef = useRef<HTMLDivElement>(null);\n // El modelo cambia en cada render; el adaptador de scroll se instala una vez\n // y lee siempre el modelo vigente a traves de esta ref.\n const modelRef = useRef(model);\n modelRef.current = model;\n\n const [preview, setPreview] = useState<PreviewRange | null>(null);\n /**\n * Rango destino mientras se arrastra un evento, y el id del que se arrastra.\n * Sin esto la tarjeta no da ninguna senal durante el gesto: se queda quieta y\n * salta a su nueva posicion solo al soltar.\n */\n const [drag, setDrag] = useState<{ id: string; preview: PreviewRange } | null>(null);\n const dragIdRef = useRef<string | null>(null);\n /** Limpiezas de los drop targets, una por columna. */\n const limpiezaColumnas = useRef(new Map<HTMLElement, () => void>());\n useEffect(() => {\n const mapa = limpiezaColumnas.current;\n return () => {\n for (const limpiar of mapa.values()) limpiar();\n mapa.clear();\n };\n }, []);\n\n // Un unico monitor para toda la vista: pdnd emite el arrastre en curso y\n // resuelve la columna destino, que es lo que permite mover a otro dia.\n useEffect(\n () =>\n monitorizarArrastres({\n api,\n getModel: () => modelRef.current,\n snap: options.snapDuration ?? options.slotDuration,\n onPreview: (rango) =>\n setDrag(rango ? { id: dragIdRef.current ?? \"\", preview: rango } : null),\n onDragging: (id) => {\n dragIdRef.current = id;\n if (id === null) setDrag(null);\n },\n }),\n [api, options.snapDuration, options.slotDuration],\n );\n\n // Adaptador de scroll: expone scrollToTime/getScrollTime a la CalendarApi.\n useEffect(() => {\n const body = bodyRef.current;\n if (!body) return;\n const adapter: CalendarViewAdapter = {\n scrollToTime(time: string): void {\n const m = modelRef.current;\n const span = m.maxMinutes - m.minMinutes;\n const content = body.scrollHeight;\n if (span <= 0 || content <= 0) return;\n const target = Math.max(m.minMinutes, Math.min(m.maxMinutes, timeStringToMinutes(time)));\n const top = ((target - m.minMinutes) / span) * content;\n body.scrollTop = Math.max(0, Math.min(top, content - body.clientHeight));\n },\n getScrollTime(): string | null {\n const m = modelRef.current;\n const span = m.maxMinutes - m.minMinutes;\n const content = body.scrollHeight;\n if (span <= 0 || content <= 0) return null;\n return minutesToTimeString(m.minMinutes + (body.scrollTop / content) * span);\n },\n };\n api.setViewAdapter(adapter);\n return () => api.setViewAdapter(null);\n }, [api]);\n\n // Posicion inicial del scroll (`scrollTime`). Solo al montar: a partir de ahi\n // el anfitrion controla el scroll con `api.scrollToTime(...)`.\n const scrollTime = options.scrollTime;\n useEffect(() => {\n if (!scrollTime) return;\n // Dos frames: el primero deja que el layout fije el alto del contenido.\n let inner = 0;\n const outer = requestAnimationFrame(() => {\n inner = requestAnimationFrame(() => api.scrollToTime(scrollTime));\n });\n return () => {\n cancelAnimationFrame(outer);\n cancelAnimationFrame(inner);\n };\n // Solo `api`: `scrollTime` es la posicion INICIAL. Incluirlo reposicionaria\n // el scroll cada vez que el anfitrion cambiase la opcion, peleandose con\n // el scroll manual del usuario.\n }, [api]);\n\n /** Minutos (ajustados al snap) del punto vertical del cursor en una columna. */\n const minutesAtPointer = (colEl: HTMLElement, clientY: number): number => {\n const rect = colEl.getBoundingClientRect();\n if (rect.height === 0 || total <= 0) return model.minMinutes;\n const raw = ((clientY - rect.top) / rect.height) * total;\n const snapped = Math.floor(Math.max(0, Math.min(total, raw)) / snapMin) * snapMin;\n return model.minMinutes + snapped;\n };\n\n const axisDay = model.days[0];\n\n return (\n <div data-rsv=\"timegrid\" style={`--rsv-tg-days:${model.days.length}`}>\n {/* Cabecera de dias */}\n <div data-rsv=\"tg-header\" role=\"row\">\n <div data-rsv=\"tg-axis-corner\" />\n {model.days.map((d) => {\n const date = dl.toDate(d.date);\n const text = headerFmt ? headerFmt(date) : \"\";\n const headerArg = {\n date,\n text,\n dayOfWeek: dl.dayOfWeek(d.date),\n dayNumber: dl.dayOfMonth(d.date),\n isToday: d.isToday,\n view,\n };\n return (\n <div\n data-rsv=\"tg-col-header\"\n role=\"columnheader\"\n data-today={String(d.isToday)}\n data-date={dl.toISOString(d.date)}\n data-nav-link={options.navLinks ? \"true\" : undefined}\n class={cx(options.classNames?.dayHeader)}\n key={dl.toISOString(d.date)}\n ref={(el) => callDidMount(el, options.hooks?.dayHeaderDidMount, () => headerArg)}\n onClick={options.navLinks ? () => navLinkToDay(api, d.date) : undefined}\n >\n {renderSlot(options.slots?.dayHeaderContent, headerArg, text, options.hostBridge)}\n </div>\n );\n })}\n </div>\n\n {/* Franja de todo el dia */}\n {showAllDay && (\n <div data-rsv=\"tg-allday\" role=\"row\">\n <div data-rsv=\"tg-axis-label\">{getLocaleText(options.locale).allDay}</div>\n {model.days.map((d) => (\n <div\n data-rsv=\"tg-allday-cell\"\n key={dl.toISOString(d.date)}\n onClick={() => api.trigger(\"dateClick\", { date: d.date, allDay: true })}\n >\n {d.allDayEvents\n .filter((event) => event.display !== \"none\")\n .map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day=\"true\"\n data-event-id={event.id}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-display={event.display}\n key={event.id}\n style={\n `--rsv-event-bg:${event.backgroundColor};` +\n `--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n {renderSlot(\n options.slots?.eventContent,\n { event, isAllDay: true, timeText: \"\", view },\n event.title,\n options.hostBridge,\n )}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Cuerpo: eje + columnas de dia */}\n <div data-rsv=\"tg-body\" ref={bodyRef}>\n <div data-rsv=\"tg-axis\" style={`height:${bodyHeight}`}>\n {model.slots.map((slot) => {\n const minutes = model.minMinutes + slot.offsetMin;\n let text = \"\";\n if (slot.isMajor) {\n text =\n slotFmt && axisDay\n ? slotFmt(dl.toDate(dl.add(dl.startOf(axisDay.date, \"day\"), { minutes })))\n : slot.label || minutesToLabel(minutes);\n }\n const labelArg = { text, minutes, isMajor: slot.isMajor, view };\n return (\n <div data-rsv=\"tg-slot\" data-major={String(slot.isMajor)} key={slot.offsetMin}>\n <span\n data-rsv=\"tg-slot-label\"\n class={cx(options.classNames?.slotLabel)}\n ref={(el) => callDidMount(el, options.hooks?.slotLabelDidMount, () => labelArg)}\n >\n {renderSlot(options.slots?.slotLabelContent, labelArg, text, options.hostBridge)}\n </span>\n </div>\n );\n })}\n </div>\n\n {model.days.map((d, dayIndex) => (\n <div\n data-rsv=\"tg-col\"\n data-today={String(d.isToday)}\n data-business={String(d.isBusiness)}\n data-date={dl.toISOString(d.date)}\n data-rsv-day-index={String(dayIndex)}\n ref={(el) => {\n // Preact llama a los refs en CADA render: sin esta guarda se\n // registraria un drop target nuevo por render sobre el mismo\n // elemento, acumulando registros.\n if (!el || limpiezaColumnas.current.has(el)) return;\n limpiezaColumnas.current.set(el, hacerColumnaDestino(el));\n }}\n style={`height:${bodyHeight}`}\n key={dl.toISOString(d.date)}\n onClick={(e) => {\n // Tras soltar una tarjeta el navegador dispara un click aqui:\n // sin esto se creaba un borrador justo despues de mover la cita.\n if (arrastreReciente()) return;\n // FullCalendar entrega en `dateClick` la hora del slot pulsado,\n // no el inicio del dia: se deriva de la posicion del cursor.\n const minutes = minutesAtPointer(e.currentTarget as HTMLElement, e.clientY);\n if (!permiteCrear(d.date, minutes)) return;\n api.trigger(\"dateClick\", {\n date: dl.add(dl.startOf(d.date, \"day\"), { minutes }),\n allDay: false,\n });\n }}\n onPointerDown={\n options.selectable\n ? (e) => {\n const minutes = minutesAtPointer(e.currentTarget as HTMLElement, e.clientY);\n if (!permiteCrear(d.date, minutes)) return;\n startTimeRangeSelect(e, {\n api,\n date: d.date,\n model,\n columnEl: e.currentTarget as HTMLElement,\n snap: options.snapDuration ?? options.slotDuration,\n onPreview: options.selectMirror\n ? (range) =>\n setPreview(\n range\n ? { dayIndex, startMin: range.startMin, endMin: range.endMin }\n : null,\n )\n : undefined,\n });\n }\n : undefined\n }\n >\n {d.nonBusinessPct.map((banda) => (\n <div\n data-rsv=\"tg-nonbusiness\"\n style={`top:${banda.topPct}%;height:${banda.heightPct}%`}\n key={banda.topPct}\n />\n ))}\n {preview?.dayIndex === dayIndex && total > 0 && (\n <div\n data-rsv=\"select-mirror\"\n style={\n `top:${((preview.startMin - model.minMinutes) / total) * 100}%;` +\n `height:${((preview.endMin - preview.startMin) / total) * 100}%`\n }\n />\n )}\n {d.timedSegs\n .filter((seg) => seg.event.display !== \"none\")\n .map((seg) => (\n <TimedEvent\n api={api}\n seg={seg}\n model={model}\n options={options}\n view={view}\n key={seg.event.id}\n dragging={drag?.id === seg.event.id}\n onDragPreview={(range) =>\n setDrag(range ? { id: seg.event.id, preview: { dayIndex, ...range } } : null)\n }\n />\n ))}\n {drag?.preview.dayIndex === dayIndex && total > 0 && (\n <div\n data-rsv=\"drag-mirror\"\n style={\n `top:${((drag.preview.startMin - model.minMinutes) / total) * 100}%;` +\n `height:${((drag.preview.endMin - drag.preview.startMin) / total) * 100}%`\n }\n />\n )}\n {model.nowIndicator?.dayIndex === dayIndex && (\n <div data-rsv=\"now-indicator\" style={`top:${model.nowIndicator.topPct}%`} />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction TimedEvent({\n api,\n seg,\n model,\n options,\n view,\n dragging,\n onDragPreview,\n}: {\n api: CalendarApi;\n seg: TimeGridSeg;\n model: TimeGridModel;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** El evento se esta arrastrando ahora mismo (para elevarlo con CSS). */\n dragging?: boolean;\n /** Rango destino en curso, o `null` al soltar. */\n onDragPreview?: (range: { startMin: number; endMin: number } | null) => void;\n}): VNode {\n const { event } = seg;\n const editable = options.editable === true && event.editable !== false;\n /**\n * Arrastrar es un permiso aparte del de redimensionar: `editable` es el\n * maestro y `eventDraggable` apaga solo el movimiento.\n */\n // Nota: `EventInput.startEditable` existe en el tipo publico pero\n // `normalizeEvent` no lo traslada a `EventDef`, asi que por ahora el permiso\n // por evento no se puede afinar; solo el global.\n const arrastrable = editable && options.eventDraggable === true;\n /** Limpieza del `draggable` de pdnd; se rehace si cambia el nodo. */\n const limpiarArrastre = useRef<(() => void) | null>(null);\n const nodoArrastre = useRef<HTMLElement | null>(null);\n useEffect(() => () => limpiarArrastre.current?.(), []);\n const selected = api.selectedEventIds.value.has(event.id);\n const widthPct = 100 / seg.colCount;\n const eventFmt = timeFormatter(options.locale ?? \"en\", options.eventTimeFormat);\n const timeText = eventFmt ? eventFmt(dl.toDate(event.start)) : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: false, timeText, view };\n const content = renderSlot(\n options.slots?.eventContent,\n contentArg,\n <span data-rsv=\"event-title\">\n {timeText} {event.title}\n </span>,\n options.hostBridge,\n );\n\n const getColumn = (el: HTMLElement): HTMLElement =>\n (el.closest('[data-rsv=\"tg-col\"]') as HTMLElement | null) ?? el;\n\n return (\n <div\n data-rsv=\"event\"\n data-all-day=\"false\"\n data-display={event.display}\n data-event-id={event.id}\n data-rsv-selected={String(selected)}\n data-rsv-dragging={dragging ? \"true\" : undefined}\n class={cx(options.classNames?.event, ...event.classNames)}\n role=\"button\"\n tabIndex={0}\n ref={(el) => {\n callDidMount(el, options.hooks?.eventDidMount, () => contentArg);\n // Solo se re-registra si cambia el NODO. Preact llama a los refs en cada\n // render, y destruir y recrear el `draggable` a mitad de un arrastre lo\n // cancelaria.\n if (el === nodoArrastre.current) return;\n limpiarArrastre.current?.();\n nodoArrastre.current = el;\n limpiarArrastre.current = el ? hacerEventoArrastrable(el, event, arrastrable) : null;\n }}\n style={\n `position:absolute;` +\n `top:${seg.topPct}%;height:${seg.heightPct}%;` +\n `left:${seg.col * widthPct}%;width:${widthPct}%;` +\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n // Igual que en la columna: el click que sigue a un arrastre abriria el\n // detalle de la cita que se acaba de mover.\n if (arrastreReciente()) return;\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n onKeyDown={\n editable\n ? (e) =>\n handleEventKeydown(e, {\n api,\n event,\n kind: \"timeGrid\",\n snap: options.snapDuration ?? options.slotDuration,\n shortcuts: options.keyboardShortcuts,\n })\n : undefined\n }\n >\n {editable && (\n <span\n data-rsv=\"resize-handle\"\n data-edge=\"start\"\n onPointerDown={(e) =>\n startEventDrag(e, {\n api,\n event,\n model,\n columnEl: getColumn(e.currentTarget as HTMLElement),\n snap: options.snapDuration,\n onPreview: onDragPreview,\n edge: \"start\",\n })\n }\n />\n )}\n {content}\n {editable && (\n <span\n data-rsv=\"resize-handle\"\n data-edge=\"end\"\n onPointerDown={(e) =>\n startEventDrag(e, {\n api,\n event,\n model,\n columnEl: getColumn(e.currentTarget as HTMLElement),\n snap: options.snapDuration,\n onPreview: onDragPreview,\n edge: \"end\",\n })\n }\n />\n )}\n </div>\n );\n}\n","import { dl, getLocaleText, type CalendarApi, type ListModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport { dateFormatter, timeFormatter } from \"../../render/format.js\";\n\ninterface ListViewProps {\n api: CalendarApi;\n model: ListModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de agenda en lista (listDay/Week/Month/Year). */\nexport function ListView({ api, model, options }: ListViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const text = getLocaleText(options.locale);\n const dayFmt = dateFormatter(locale, options.listDayFormat, {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n // Texto secundario de la cabecera (a la derecha); solo si se pide.\n const daySideFmt = options.listDaySideFormat\n ? dateFormatter(locale, options.listDaySideFormat, { month: \"short\", day: \"2-digit\" })\n : null;\n const eventFmt = timeFormatter(locale, options.eventTimeFormat);\n\n if (model.isEmpty) {\n return (\n <div data-rsv=\"list\">\n <div data-rsv=\"list-empty\">{text.noEvents}</div>\n </div>\n );\n }\n\n return (\n <div data-rsv=\"list\" role=\"list\">\n {model.days.map((day) => (\n <div data-rsv=\"list-day\" data-today={String(day.isToday)} key={dl.toISOString(day.date)}>\n <div data-rsv=\"list-day-header\" role=\"heading\" aria-level={3}>\n <span data-rsv=\"list-day-text\">\n {dayFmt ? dayFmt(dl.toDate(day.date)) : \"\"}\n </span>\n {daySideFmt && (\n <span data-rsv=\"list-day-side-text\">{daySideFmt(dl.toDate(day.date))}</span>\n )}\n </div>\n {day.events\n .filter((event) => event.display !== \"none\")\n .map((event) => {\n const timeText = event.allDay\n ? text.allDay\n : eventFmt\n ? eventFmt(dl.toDate(event.start))\n : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: event.allDay, timeText, view };\n return (\n <div\n data-rsv=\"list-item\"\n role=\"listitem\"\n tabIndex={0}\n key={event.id}\n data-event-id={event.id}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-display={event.display}\n ref={(el) => callDidMount(el, options.hooks?.eventDidMount, () => contentArg)}\n style={\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n <span data-rsv=\"list-item-time\">{timeText}</span>\n <span\n data-rsv=\"list-item-dot\"\n style={`--rsv-event-bg:${event.backgroundColor}`}\n />\n {/* div y no span: el `eventContent` del anfitrion suele\n devolver contenido de bloque. */}\n <div data-rsv=\"list-item-title\">\n {renderSlot(\n options.slots?.eventContent,\n contentArg,\n event.title,\n options.hostBridge,\n )}\n </div>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import { dl, type CalendarApi, type MultiMonthModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { DayGridView } from \"../daygrid/DayGridView.js\";\n\ninterface MultiMonthViewProps {\n api: CalendarApi;\n model: MultiMonthModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de varios meses (año): rejilla responsive de cuadrículas mensuales. */\nexport function MultiMonthView({ api, model, options }: MultiMonthViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const monthFmt = new Intl.DateTimeFormat(locale, { month: \"long\" });\n\n return (\n <div data-rsv=\"multimonth\">\n {model.months.map((month) => (\n <section data-rsv=\"mm-month\" key={dl.toISOString(month.date)}>\n <header data-rsv=\"mm-title\">{monthFmt.format(dl.toDate(month.date))}</header>\n <DayGridView api={api} model={month.dayGrid} options={options} />\n </section>\n ))}\n </div>\n );\n}\n","import { type CalendarApi, type TimelineModel, type TimelineSeg } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { renderSlot } from \"../../render/slots.js\";\n\nconst LANE_REM = 1.6;\n\ninterface TimelineViewProps {\n api: CalendarApi;\n model: TimelineModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista timeline: eje temporal horizontal con eventos apilados en carriles. */\nexport function TimelineView({ api, model, options }: TimelineViewProps): VNode {\n return (\n <div data-rsv=\"timeline\">\n <div data-rsv=\"tl-axis\" role=\"row\">\n {model.slots.map((slot) => (\n <div data-rsv=\"tl-slot\" style={`left:${slot.leftPct}%`} key={slot.leftPct}>\n {slot.label}\n </div>\n ))}\n </div>\n <div data-rsv=\"tl-body\" style={`height:${model.laneCount * LANE_REM + 0.5}rem`}>\n {model.segs.map((seg) => (\n <TimelineEvent api={api} seg={seg} options={options} key={seg.event.id} />\n ))}\n </div>\n </div>\n );\n}\n\nexport function TimelineEvent({\n api,\n seg,\n options,\n}: {\n api: CalendarApi;\n seg: TimelineSeg;\n options: ReserviCalendarOptions;\n}): VNode {\n const { event } = seg;\n return (\n <div\n data-rsv=\"event\"\n data-event-id={event.id}\n role=\"button\"\n tabIndex={0}\n style={\n `position:absolute;left:${seg.leftPct}%;width:${seg.widthPct}%;` +\n `top:${seg.lane * LANE_REM}rem;height:${LANE_REM - 0.2}rem;` +\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {renderSlot(\n options.slots?.eventContent,\n { event, isAllDay: event.allDay, timeText: \"\", view: { type: api.getView().type } },\n event.title,\n options.hostBridge,\n )}\n </div>\n );\n}\n","import { type CalendarApi, type ResourceTimelineModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { TimelineEvent } from \"../timeline/TimelineView.js\";\n\nconst LANE_REM = 1.6;\n\ninterface ResourceTimelineViewProps {\n api: CalendarApi;\n model: ResourceTimelineModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista resource-timeline (Scheduler): filas de recursos × eje temporal. */\nexport function ResourceTimelineView({ api, model, options }: ResourceTimelineViewProps): VNode {\n return (\n <div data-rsv=\"resource-timeline\">\n {/* Cabecera: área de recursos + eje temporal */}\n <div data-rsv=\"rt-header\" role=\"row\">\n <div data-rsv=\"resource-area-header\">\n {options.locale === \"es\" ? \"Recursos\" : \"Resources\"}\n </div>\n <div data-rsv=\"tl-axis\">\n {model.slots.map((slot) => (\n <div data-rsv=\"tl-slot\" style={`left:${slot.leftPct}%`} key={slot.leftPct}>\n {slot.label}\n </div>\n ))}\n </div>\n </div>\n\n {/* Filas de recursos */}\n {model.lanes.map((lane) => {\n const rowHeight = lane.laneCount * LANE_REM + 0.4;\n return (\n <div data-rsv=\"resource-row\" role=\"row\" key={lane.row.resource.id}>\n <div\n data-rsv=\"resource-label\"\n style={`padding-inline-start:${0.5 + lane.row.depth * 1}rem`}\n >\n {lane.row.hasChildren && (\n <button\n type=\"button\"\n data-rsv=\"resource-toggle\"\n aria-expanded={lane.row.expanded}\n onClick={() => api.toggleResource(lane.row.resource.id)}\n >\n {lane.row.expanded ? \"▾\" : \"▸\"}\n </button>\n )}\n <span data-rsv=\"resource-title\">{lane.row.resource.title}</span>\n </div>\n <div data-rsv=\"resource-lane\" style={`height:${rowHeight}rem`}>\n {lane.segs.map((seg) => (\n <TimelineEvent api={api} seg={seg} options={options} key={seg.event.id} />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { dl, getLocaleText, type CalendarApi, type ResourceTimeGridModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceTimeGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista vertical de recursos: recursos como columnas sobre un eje de tiempo. */\nexport function ResourceTimeGridView({ api, model, options }: Props): VNode {\n const bodyHeight = `calc(var(--spacing-rsv-slot, 2.5rem) * ${model.slots.length})`;\n\n return (\n <div data-rsv=\"timegrid\" style={`--rsv-tg-days:${model.columns.length}`}>\n <div data-rsv=\"tg-header\" role=\"row\">\n <div data-rsv=\"tg-axis-corner\" />\n {model.columns.map((col) => (\n <div data-rsv=\"tg-col-header\" role=\"columnheader\" key={col.row.resource.id}>\n {col.row.resource.title}\n </div>\n ))}\n </div>\n\n <div data-rsv=\"tg-allday\" role=\"row\">\n <div data-rsv=\"tg-axis-label\">{getLocaleText(options.locale).allDay}</div>\n {model.columns.map((col) => (\n <div data-rsv=\"tg-allday-cell\" key={col.row.resource.id}>\n {col.allDayEvents.map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day=\"true\"\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor}`}\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {event.title}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n <div data-rsv=\"tg-body\">\n <div data-rsv=\"tg-axis\" style={`height:${bodyHeight}`}>\n {model.slots.map((slot) => (\n <div data-rsv=\"tg-slot\" data-major={String(slot.isMajor)} key={slot.offsetMin}>\n <span data-rsv=\"tg-slot-label\">{slot.label}</span>\n </div>\n ))}\n </div>\n\n {model.columns.map((col) => (\n <div\n data-rsv=\"tg-col\"\n data-rsv-resource-id={col.row.resource.id}\n style={`height:${bodyHeight}`}\n key={col.row.resource.id}\n >\n {col.timedSegs.map((seg) => {\n const widthPct = 100 / seg.colCount;\n return (\n <div\n data-rsv=\"event\"\n data-all-day=\"false\"\n data-event-id={seg.event.id}\n role=\"button\"\n tabIndex={0}\n key={seg.event.id}\n style={\n `position:absolute;top:${seg.topPct}%;height:${seg.heightPct}%;` +\n `left:${seg.col * widthPct}%;width:${widthPct}%;` +\n `--rsv-event-bg:${seg.event.backgroundColor};--rsv-event-fg:${seg.event.textColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"eventClick\", { event: seg.event });\n }}\n >\n {dl.format(seg.event.start, \"HH:mm\")} {seg.event.title}\n </div>\n );\n })}\n {model.nowTopPct != null && (\n <div data-rsv=\"now-indicator\" style={`top:${model.nowTopPct}%`} />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { dl, type CalendarApi, type ResourceDayGridModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceDayGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Recursos como columnas en cuadrícula de día (eventos apilados por recurso). */\nexport function ResourceDayGridView({ api, model }: Props): VNode {\n return (\n <div data-rsv=\"resource-daygrid\" style={`--rsv-rdg-cols:${model.columns.length}`}>\n <div data-rsv=\"rdg-header\" role=\"row\">\n {model.columns.map((col) => (\n <div data-rsv=\"rdg-col-header\" role=\"columnheader\" key={col.row.resource.id}>\n {col.row.resource.title}\n </div>\n ))}\n </div>\n <div data-rsv=\"rdg-body\" role=\"row\">\n {model.columns.map((col) => (\n <div\n data-rsv=\"rdg-col\"\n data-rsv-resource-id={col.row.resource.id}\n key={col.row.resource.id}\n >\n {col.events.map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day={String(event.allDay)}\n data-event-id={event.id}\n role=\"button\"\n tabIndex={0}\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};--rsv-event-border:${event.borderColor}`}\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {event.allDay ? \"\" : dl.format(event.start, \"HH:mm\") + \" \"}\n {event.title}\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import {\n dl,\n getLocaleText,\n type CalendarApi,\n type ResourceDayGridMonthCell,\n type ResourceDayGridMonthModel,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceDayGridMonthModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista mensual con recursos como columnas anidadas dentro de cada día. */\nexport function ResourceDayGridMonthView({ api, model, options }: Props): VNode {\n return (\n <div data-rsv=\"resource-daygrid-month\" style={`--rsv-rdgm-cols:${model.columnCount}`}>\n {model.weeks.map((week, wi) => (\n <div data-rsv=\"rdgm-week\" role=\"row\" key={`week-${wi}`}>\n {week.days.map((cell) => (\n <ResourceMonthCell\n api={api}\n cell={cell}\n options={options}\n key={dl.toISOString(cell.date)}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ResourceMonthCell({\n api,\n cell,\n options,\n}: {\n api: CalendarApi;\n cell: ResourceDayGridMonthCell;\n options: ReserviCalendarOptions;\n}): VNode {\n const dayNumber = dl.dayOfMonth(cell.date);\n return (\n <div\n data-rsv=\"day\"\n role=\"gridcell\"\n data-date={dl.toISOString(cell.date)}\n data-today={String(cell.isToday)}\n data-other={String(cell.isOther)}\n >\n <span data-rsv=\"day-number\">{dayNumber}</span>\n <div data-rsv=\"rdgm-columns\">\n {cell.columns.map((col) => (\n <div data-rsv=\"rdgm-col\" data-rsv-resource-id={col.row.resource.id} key={col.row.resource.id}>\n <span data-rsv=\"rdgm-col-label\">{col.row.resource.title}</span>\n {col.events.map((event) => {\n const selected = api.selectedEventIds.value.has(event.id);\n return (\n <div\n data-rsv=\"event\"\n data-all-day={String(event.allDay)}\n data-event-id={event.id}\n data-rsv-selected={String(selected)}\n role=\"button\"\n tabIndex={0}\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};--rsv-event-border:${event.borderColor}`}\n onClick={(e) => {\n e.stopPropagation();\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n {event.allDay ? \"\" : `${dl.format(event.start, \"HH:mm\")} `}\n {event.title}\n </div>\n );\n })}\n {col.moreCount > 0 && (\n <span\n data-rsv=\"rdgm-more\"\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"moreLinkClick\", {\n date: cell.date,\n allEvents: [...col.events, ...col.hiddenEvents],\n hiddenEvents: col.hiddenEvents,\n });\n }}\n >\n {getLocaleText(options.locale).more(col.moreCount)}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","// Importar @preact/signals activa el seguimiento automático de signals en los\n// componentes: leer `api.viewModel.value` re-renderiza de forma granular.\nimport \"@preact/signals\";\nimport { getLocaleText, themeToStyle, THEME_TOKEN_VARS, type CalendarApi } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef } from \"preact/hooks\";\nimport type { ReserviCalendarOptions } from \"../types.js\";\nimport { cx } from \"../render/slots.js\";\nimport { pickResponsiveView } from \"../interaction/responsive.js\";\nimport { Toolbar } from \"./Toolbar.js\";\nimport { DayGridView } from \"../views/daygrid/DayGridView.js\";\nimport { TimeGridView } from \"../views/timegrid/TimeGridView.js\";\nimport { ListView } from \"../views/list/ListView.js\";\nimport { MultiMonthView } from \"../views/multimonth/MultiMonthView.js\";\nimport { TimelineView } from \"../views/timeline/TimelineView.js\";\nimport { ResourceTimelineView } from \"../views/resource/ResourceTimelineView.js\";\nimport { ResourceTimeGridView } from \"../views/resource/ResourceTimeGridView.js\";\nimport { ResourceDayGridView } from \"../views/resource/ResourceDayGridView.js\";\nimport { ResourceDayGridMonthView } from \"../views/resource/ResourceDayGridMonthView.js\";\n\ninterface CalendarProps {\n api: CalendarApi;\n options: ReserviCalendarOptions;\n}\n\n/** Componente raíz: lee el ViewModel reactivo y delega en la vista activa. */\nexport function Calendar({ api, options }: CalendarProps): VNode {\n const vm = api.viewModel.value; // reactivo (signals)\n const dir = options.direction ?? getLocaleText(options.locale).direction;\n const hourHeight = api.getEffectiveOption(\"hourHeight\", vm.type);\n const height = api.getEffectiveOption(\"height\", vm.type);\n const themeStyle =\n [\n options.themeTokens ? themeToStyle(options.themeTokens) : \"\",\n hourHeight ? `${THEME_TOKEN_VARS.slotHeight}:${hourHeight}px` : \"\",\n height != null && height !== \"auto\"\n ? `height:${typeof height === \"number\" ? `${height}px` : height}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\";\") || undefined;\n\n const rootRef = useRef<HTMLDivElement>(null);\n\n // La CalendarApi expone `el` (como FullCalendar) para que el anfitrion pueda\n // aplicar clases o medir el contenedor.\n useEffect(() => {\n api.setRootEl(rootRef.current);\n return () => api.setRootEl(null);\n }, [api]);\n // Ref para leer siempre el `responsiveViews` más reciente sin re-crear el\n // ResizeObserver en cada render (solo se monta una vez por instancia de `api`).\n const responsiveViewsRef = useRef(options.responsiveViews);\n responsiveViewsRef.current = options.responsiveViews;\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof ResizeObserver === \"undefined\") return;\n let frame = 0;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n const width = entry?.contentRect.width ?? root.clientWidth;\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const config = responsiveViewsRef.current;\n if (!config?.length) return;\n const next = pickResponsiveView(config, width);\n if (next && next !== api.getView().type && api.hasView(next)) api.changeView(next);\n });\n });\n observer.observe(root);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [api]);\n\n return (\n <div\n ref={rootRef}\n data-rsv=\"root\"\n dir={dir}\n data-rsv-theme={options.theme}\n data-rsv-autoheight={height === \"auto\" ? \"true\" : undefined}\n style={themeStyle}\n class={cx(options.classNames?.root)}\n >\n {options.headerToolbar !== false && (\n <Toolbar api={api} title={vm.title} activeView={vm.type} options={options} />\n )}\n <div data-rsv=\"view\" data-view={vm.type}>\n {vm.dayGrid ? (\n <DayGridView api={api} model={vm.dayGrid} options={options} />\n ) : vm.timeGrid ? (\n <TimeGridView api={api} model={vm.timeGrid} options={options} />\n ) : vm.list ? (\n <ListView api={api} model={vm.list} options={options} />\n ) : vm.multiMonth ? (\n <MultiMonthView api={api} model={vm.multiMonth} options={options} />\n ) : vm.resourceTimeGrid ? (\n <ResourceTimeGridView api={api} model={vm.resourceTimeGrid} options={options} />\n ) : vm.resourceDayGrid ? (\n <ResourceDayGridView api={api} model={vm.resourceDayGrid} options={options} />\n ) : vm.resourceDayGridMonth ? (\n <ResourceDayGridMonthView api={api} model={vm.resourceDayGridMonth} options={options} />\n ) : vm.resourceTimeline ? (\n <ResourceTimelineView api={api} model={vm.resourceTimeline} options={options} />\n ) : vm.timeline ? (\n <TimelineView api={api} model={vm.timeline} options={options} />\n ) : (\n <div data-rsv=\"unsupported\">\n La vista \"{vm.type}\" se implementa en una fase posterior.\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { h, render } from \"preact\";\nimport { CalendarApi } from \"@reservi/core\";\nimport { Calendar } from \"./components/Calendar.js\";\nimport type { ReserviCalendarOptions } from \"./types.js\";\n\nexport interface ReserviCalendarHandle {\n /** API del calendario (navegación, eventos, callbacks). */\n readonly api: CalendarApi;\n /** Desmonta el calendario y libera recursos. */\n destroy(): void;\n}\n\n/**\n * Monta un calendario Reservi en un elemento del DOM. API agnóstica usada\n * directamente (vanilla/Preact) y por los wrappers de framework.\n */\nexport function mount(el: HTMLElement, options: ReserviCalendarOptions): ReserviCalendarHandle {\n const api = new CalendarApi(options);\n render(h(Calendar, { api, options }), el);\n\n return {\n api,\n destroy() {\n render(null, el);\n api.destroy();\n },\n };\n}\n","import { eventsToICS, type EventInput } from \"@reservi/core\";\n\n/**\n * Exporta eventos a un archivo `.ics` y dispara la descarga en el navegador.\n * Capa de UI (usa DOM); la serialización pura vive en `@reservi/core`.\n */\nexport function downloadICS(events: EventInput[], filename = \"calendar.ics\"): void {\n if (typeof document === \"undefined\") return;\n const ics = eventsToICS(events);\n const blob = new Blob([ics], { type: \"text/calendar;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n}\n\nexport { parseICS, eventsToICS } from \"@reservi/core\";\n"],"names":["hostSlot","node","isHostSlot","value","renderSlot","slot","arg","fallback","bridge","result","jsx","HostSlotOutlet","hostSeq","idRef","useRef","elRef","nodeRef","liveRef","useLayoutEffect","el","id","cx","classes","notified","callDidMount","hook","buildArg","html","pickResponsiveView","entries","width","sorted","b","chosen","entry","NAV_SYMBOLS","NON_VIEW_TOKENS","MONTH_VIEW_RE","pad2","n","CalendarIcon","jsxs","resolveViews","options","_a","tb","s","g","t","Toolbar","api","title","activeView","text","getLocaleText","startSlot","_b","endSlot","_d","_c","views","monthMode","firstDay","wrapRef","open","setOpen","useState","selected","dl","nowRef","viewYear","setViewYear","viewMonth","setViewMonth","monthShortFmt","monthLongFmt","dowFmt","monthNames","_","i","openPicker","d","shiftMonth","delta","total","goto","iso","useEffect","onKey","e","onPointer","dayGrid","first","offset","start","cells","dows","_e","y","label","v","minutesToLabel","minutes","minutesToTimeString","m","timeFormatter","locale","fmt","date","dateFormatter","navLinkToDay","target","DAY","DEFAULT_SHORTCUTS","resolveAction","key","shortcuts","action","defaultKeys","handleEventKeydown","opts","event","kind","snapMin","timeStringToMinutes","deltaMin","next","computeDrop","updated","dateAtPoint","x","startDayRangeSelect","ev","endStr","moved","onMove","onUp","a","lo","hi","_arrayWithHoles","r","_iterableToArrayLimit","l","u","f","o","_arrayLikeToArray","_unsupportedIterableToArray","arrayLikeToArray","_nonIterableRest","_slicedToArray","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","bind_1","bind","type","listener","__assign","this","p","bindAll_1","require$$0","toOptions","getBinding","original","sharedOptions","binding","bindAll","bindings","unbinds","unbind","exports","bind_all_1","require$$1","honeyPotDataAttribute","isHoneyPotElement","getElementFromPointWithoutHoneypot","client","_document$elementsFro","_document$elementsFro2","top","second","_typeof","toPrimitive","toPropertyKey","_defineProperty","maxZIndex","popoverResetUserAgentStyles","once","fn","cache","_len","args","_key","supportsPopover","ownKeys","_objectSpread","honeyPotSize","halfHoneyPotSize","floorToClosestPixel","point","pullBackByHalfHoneyPotSize","preventGoingBackwardsOffScreen","preventGoingForwardsOffScreen","getHoneyPotRectFor","_ref","getRectStyles","_ref2","clientRect","isWithin","_ref3","mountHoneyPot","_ref4","initial","element","unbindPointerMove","_ref5","current","cleanup","unbindPostDragEvents","makeHoneyPotFix","latestPointerMove","bindEvents","getOnPostDispatch","finish","_ref6","eventName","payload","input","_finish","_input","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_toConsumableArray","arrayWithoutHoles","iterableToArray","nonIterableSpread","isFirefox","isSafari","_navigator","userAgent","isNodeLike","isFromAnotherWindow","eventTarget","symbols","getInitialState","state","resetState","isLeavingWindowInSafari","dragLeave","isLeavingWindow","relatedTarget","getBindingsForBrokenDrags","onDragEnd","callCount","getInput","rafSchd","lastArgs","frameId","wrapperFn","scheduleOnDrag","dragStart","scheduled","schedule","flush","makeDispatch","source","dispatchEvent","previous","safeDispatch","dispatch","nativeSetDragImage","location","updatedSourcePayload","globalState","canStart","getNativeSetDragImage","hasHierarchyChanged","dragType","getDropTargetsOver","getStartLocation","setDropEffectOnEvent","updateState","hasChanged","onUpdateEvent","nextDropTargets","cancel","unbindEvents","_current$","innerMost","dropTargets","lifecycle","ledger","registerUsage","typeKey","mount","register","combine","fns","addAttribute","attribute","_createForOfIteratorHelper","_n","F","copyReverse","array","makeDropTarget","defaultDropEffect","registry","dropTargetDataAtt","dropTargetSelector","addToRegistry","dropTargetForConsumers","existing","getActualDropTargets","_args$getData","_args$getData2","_args$getDropEffect","_args$getDropEffect2","_ref2$result","closest","feedback","data","dropEffect","record","notifyCurrent","_iterator","_step","_entry$eventName","err","actions","isCurrent","visited","_iterator2","_step2","_entry$onDropTargetCh","isOver","_entry$onDragLeave","_iterator3","_step3","_entry$onDropTargetCh2","_entry$onDragEnter","_record","_args","_entry","getIsOver","actual","lastCaptureOrdered","actualCaptureOrdered","resultCaptureOrdered","index","_argsForLast$getIsSti","last","fresh","parent","lastParent","argsForLast","makeMonitor","dragging","tryAddToActive","monitor","monitorForConsumers","active","_i","_active","_monitor","_monitor$eventName","makeAdapter","dispatchEventToSource","onPostDispatch","monitorAPI","dropTargetAPI","mountAdapter","isAndroid","androidFallbackText","textMediaType","URLMediaType","elementAdapterNativeDataKey","draggableRegistry","honeyPotFix","adapter","_entry$dragHandle","_entry$getInitialData","_entry$getInitialData2","_entry$dragHandle2","_entry$getInitialData3","_entry$getInitialData4","over","nativeData","_Object$entries","_Object$entries$_i","_draggableRegistry$ge","_draggableRegistry$ge2","dropTargetForElements","monitorForElements","draggable","defaultOffset","setCustomNativeDragPreview","render","_ref$getOffset","getOffset","container","unmount","previewOffset","rect","unbindMonitor","preserveOffsetOnSource","sourceRect","containerRect","offsetX","offsetY","instanteUltimoArrastre","marcarArrastre","arrastreReciente","ventanaMs","TIPO_EVENTO","TIPO_COLUMNA","hacerEventoArrastrable","editable","copia","hacerColumnaDestino","minutosEnColumna","columnaEl","clientY","model","crudo","acotado","duracionMin","desde","hasta","calcularDestino","dia","minutosEnDia","nuevoInicio","duracion","monitorizarArrastres","getModel","snap","onPreview","onDragging","destino","inicio","siguiente","actualizado","TIPO_DIA","calcularDestinoDia","dias","hacerDiaDestino","monitorizarArrastresDia","DayGridView","view","headerDays","showWeekNums","diaDestino","setDiaDestino","idArrastrado","setIdArrastrado","limpiezaDias","mapa","limpiar","cell","headerArg","week","wi","DayCell","dropActivo","dayNumber","defaultNumber","cellArg","numberNode","moreOpen","setMoreOpen","dateStr","rangeSelectedRef","onDayClick","openMore","EventChip","DayMorePopover","onClose","ref","dayFmt","allEvents","arrastrandose","arrastrable","limpiarArrastre","nodoArrastre","draggedRef","eventFmt","timeText","contentArg","content","EDGE_PX","MAX_SPEED_PX","NOOP_SCROLLER","startAutoScroll","lastY","scrolled","raf","tick","before","scrollAncestor","startEventDrag","columnEl","edge","totalMinutes","ppm","startY","scroller","snapMinArrastre","aMinutos","fecha","pxToSnappedMinutes","computeResize","fin","startTimeRangeSelect","yToMin","raw","clamped","startMin","endMin","dayStart","TimeGridView","headerFmt","slotFmt","showAllDay","bodyHeight","horario","resolveBusinessHours","bloquearFuera","permiteCrear","isWithinBusinessHours","bodyRef","modelRef","preview","setPreview","drag","setDrag","dragIdRef","limpiezaColumnas","rango","body","time","span","scrollTime","inner","outer","minutesAtPointer","colEl","snapped","axisDay","labelArg","dayIndex","range","banda","seg","TimedEvent","onDragPreview","widthPct","getColumn","ListView","daySideFmt","day","MultiMonthView","monthFmt","month","LANE_REM","TimelineView","TimelineEvent","ResourceTimelineView","lane","rowHeight","ResourceTimeGridView","col","ResourceDayGridView","ResourceDayGridMonthView","ResourceMonthCell","Calendar","vm","dir","hourHeight","height","themeStyle","themeToStyle","THEME_TOKEN_VARS","rootRef","responsiveViewsRef","root","frame","observer","config","CalendarApi","h","downloadICS","events","filename","ics","eventsToICS","blob","url"],"mappings":"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","x_google_ignoreList":[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/render/slots.tsx","../src/interaction/responsive.ts","../src/components/Toolbar.tsx","../src/render/format.ts","../src/render/nav.ts","../src/interaction/keyboard.ts","../src/interaction/daygrid-drag.ts","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind-all.js","../../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/index.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/honey-pot-data-attribute.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/is-honey-pot-element.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/get-element-from-point-without-honey-pot.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/max-z-index.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/popover-reset-styles.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/once.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/supports-popover.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/make-honey-pot-fix.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-firefox.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-from-another-window.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/count-events-for-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-leaving-window-in-safari.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-leaving-window.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/detect-broken-drag.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/get-input.js","../../../node_modules/.pnpm/raf-schd@4.0.3/node_modules/raf-schd/dist/raf-schd.esm.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/dispatch-consumer-event.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/lifecycle-manager.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/usage-ledger.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/combine.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/add-attribute.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-drop-target.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-monitor.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-adapter.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/android.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/media-types/text-media-type.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/media-types/url-media-type.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter-native-data-key.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js","../../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@3.1.0/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/element/custom-native-drag-preview/preserve-offset-on-source.js","../src/interaction/pdnd-timegrid.ts","../src/interaction/pdnd-daygrid.ts","../src/views/daygrid/DayGridView.tsx","../src/interaction/auto-scroll.ts","../src/interaction/drag.ts","../src/views/timegrid/TimeGridView.tsx","../src/views/list/ListView.tsx","../src/views/multimonth/MultiMonthView.tsx","../src/views/timeline/TimelineView.tsx","../src/views/resource/ResourceTimelineView.tsx","../src/views/resource/ResourceTimeGridView.tsx","../src/views/resource/ResourceDayGridView.tsx","../src/views/resource/ResourceDayGridMonthView.tsx","../src/components/Calendar.tsx","../src/mount.ts","../src/ical.ts"],"sourcesContent":["import type { CalendarOptions, EventDef } from \"@reservi/core\";\nimport type { ComponentChildren } from \"preact\";\n\n/** Vista activa tal como la reciben los slots y los hooks `*DidMount`. */\nexport interface ViewArg {\n readonly type: string;\n}\n\n/** Argumento del slot del botón \"+N more\" (popover de eventos ocultos). */\nexport interface MoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: EventDef[];\n hiddenEvents: EventDef[];\n view: ViewArg;\n}\n\n/** Argumento del slot de contenido de evento. */\nexport interface EventContentArg {\n event: EventDef;\n isAllDay: boolean;\n /** Texto de hora ya formateado (vacío si allDay). */\n timeText: string;\n view: ViewArg;\n}\n\n/** Argumento del slot de celda de día. */\nexport interface DayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: ViewArg;\n}\n\n/** Argumento del slot de cabecera de día (nombre del día de la semana). */\nexport interface DayHeaderContentArg {\n date: Date;\n text: string;\n /** Día de la semana, 0 = domingo … 6 = sábado. */\n dayOfWeek: number;\n /** Día del mes (1–31). */\n dayNumber: number;\n isToday: boolean;\n view: ViewArg;\n}\n\n/** Argumento del slot de etiqueta del eje horario (timeGrid). */\nexport interface SlotLabelContentArg {\n /** Texto ya formateado (p. ej. \"09:00\"). */\n text: string;\n /** Minutos desde medianoche del slot. */\n minutes: number;\n /** Si es una marca mayor (etiquetada). */\n isMajor: boolean;\n view: ViewArg;\n}\n\n/**\n * Marcador que puede devolver un slot cuando el contenido lo pinta el\n * framework anfitrión (React, Vue…). La capa Preact NO interpreta `node`:\n * solo reserva un hueco en el DOM y delega en el `hostBridge`.\n */\nexport interface HostSlotResult {\n readonly __rsvHost: true;\n /** Nodo del framework anfitrión (opaco para esta capa). */\n readonly node: unknown;\n}\n\n/** Crea el marcador de contenido delegado al framework anfitrión. */\nexport function hostSlot(node: unknown): HostSlotResult {\n return { __rsvHost: true, node };\n}\n\n/** ¿El resultado de un slot delega el render en el anfitrión? */\nexport function isHostSlot(value: unknown): value is HostSlotResult {\n return typeof value === \"object\" && value !== null && (value as HostSlotResult).__rsvHost === true;\n}\n\n/**\n * Puente para pintar contenido del framework anfitrión dentro del árbol de\n * Preact. Lo implementan los wrappers (p. ej. `@reservi/react` con portales).\n */\nexport interface HostBridge {\n /** Un hueco ha entrado en el DOM: pinta `node` dentro de `el`. */\n mount(id: string, el: HTMLElement, node: unknown): void;\n /** El contenido del hueco `id` ha cambiado. */\n update(id: string, node: unknown): void;\n /** El hueco `id` ha salido del DOM: libera lo que se pintó en él. */\n unmount(id: string): void;\n}\n\nexport type SlotResult = ComponentChildren | string | HostSlotResult;\n\n/**\n * Slots de render (patrón de \"content\" de FullCalendar). Cada slot devuelve\n * contenido Preact, una cadena, o `hostSlot(...)` para delegar en el anfitrión.\n */\nexport interface ReserviSlots {\n eventContent?: (arg: EventContentArg) => SlotResult;\n dayCellContent?: (arg: DayCellContentArg) => SlotResult;\n dayHeaderContent?: (arg: DayHeaderContentArg) => SlotResult;\n /** Personaliza la etiqueta del eje horario (timeGrid). */\n slotLabelContent?: (arg: SlotLabelContentArg) => SlotResult;\n /**\n * Personaliza el contenido del botón \"+N more\" (dayGrid/multiMonth). El\n * `<button>` que abre el popover se conserva; el slot solo reemplaza su\n * contenido interno (mismo patrón que `dayCellContent`).\n */\n moreLinkContent?: (arg: MoreLinkContentArg) => SlotResult;\n /**\n * Contenido libre al inicio de la toolbar (zona \"Filtrar/Personal\" del diseño).\n * El usuario decide qué botones poner y qué hacen; si no se define, no se\n * renderiza nada en esa zona.\n */\n toolbarStart?: () => SlotResult;\n /**\n * Contenido libre al final de la toolbar, antes del botón \"Añadir\".\n * Útil para acciones extra propias del anfitrión.\n */\n toolbarEnd?: () => SlotResult;\n}\n\n/**\n * Hooks de ciclo de vida sobre el DOM ya montado (equivalentes a los\n * `*DidMount` de FullCalendar). Se invocan UNA vez por elemento del DOM.\n */\nexport interface ReserviHooks {\n eventDidMount?: (arg: EventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: DayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: DayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: SlotLabelContentArg & { el: HTMLElement }) => void;\n}\n\n/** Clases por slot, fusionadas con las base. */\nexport interface ReserviClassNames {\n root?: string;\n toolbar?: string;\n /** Celda de día (dayGrid/multiMonth). */\n day?: string;\n event?: string;\n /** Cabecera de día (nombre del día / columna). */\n dayHeader?: string;\n /** Etiqueta del eje horario (timeGrid). */\n slotLabel?: string;\n}\n\n/** Opciones de la capa Preact = opciones de núcleo + presentación. */\nexport interface ReserviCalendarOptions extends CalendarOptions {\n slots?: ReserviSlots;\n hooks?: ReserviHooks;\n classNames?: ReserviClassNames;\n /**\n * Puente de render del framework anfitrión. Lo inyecta el wrapper; no es\n * necesario configurarlo a mano en uso vanilla/Preact.\n */\n hostBridge?: HostBridge;\n /**\n * Vistas a mostrar como pestañas en la segunda fila de la toolbar\n * (p. ej. [\"dayGridMonth\", \"timeGridWeek\", \"listWeek\"]). Si se omite, se\n * derivan de los tokens de `headerToolbar`; si tampoco hay, no se muestra la fila.\n */\n views?: string[];\n /**\n * Callback del botón \"Añadir\". Solo si se define se renderiza el botón; el\n * anfitrión decide qué ocurre al pulsarlo (abrir un modal, navegar, etc.).\n */\n onAddClick?: () => void;\n /** Texto del botón \"Añadir\" (def. \"+\" sin etiqueta). */\n addButtonText?: string;\n /**\n * Cambia de vista automáticamente al redimensionar el contenedor (p. ej.\n * mes → lista en mobile). Se evalúa el `breakpoint` más alto que sea\n * `<= ancho actual` (estilo media query `min-width`).\n */\n responsiveViews?: { breakpoint: number; view: string }[];\n}\n","import type { ComponentChildren, VNode } from \"preact\";\nimport { useLayoutEffect, useRef } from \"preact/hooks\";\nimport { isHostSlot, type HostBridge, type SlotResult } from \"../types.js\";\n\n/**\n * Resuelve un slot de contenido: si el usuario aportó una función, usa su\n * resultado; si no, usa el contenido por defecto. Unifica el contrato de los\n * render hooks para todos los frameworks (en wrappers se adapta a su idioma).\n *\n * Si el slot devuelve `hostSlot(node)`, se reserva un hueco en el DOM y el\n * `bridge` del framework anfitrión pinta el contenido dentro (React usa\n * portales). Sin bridge se cae al contenido por defecto.\n */\nexport function renderSlot<Arg>(\n slot: ((arg: Arg) => SlotResult) | undefined,\n arg: Arg,\n fallback: ComponentChildren,\n bridge?: HostBridge | undefined,\n): ComponentChildren {\n if (!slot) return fallback;\n const result = slot(arg);\n // Como en FullCalendar, `undefined` significa \"usa el contenido por defecto\"\n // (los wrappers lo devuelven cuando el anfitrion no aporta ese render prop).\n if (result === undefined) return fallback;\n if (isHostSlot(result)) {\n if (!bridge) return fallback;\n return <HostSlotOutlet bridge={bridge} node={result.node} />;\n }\n return result as ComponentChildren;\n}\n\nlet hostSeq = 0;\n\n/**\n * Hueco en el DOM cuyo contenido pinta el framework anfitrión. Se identifica\n * por posición (un id por instancia montada), así que eventos repetidos en\n * varias celdas o en el popover no colisionan.\n */\nfunction HostSlotOutlet({ bridge, node }: { bridge: HostBridge; node: unknown }): VNode {\n const idRef = useRef(\"\");\n if (!idRef.current) idRef.current = `rsv-host-${++hostSeq}`;\n const elRef = useRef<HTMLDivElement>(null);\n const nodeRef = useRef(node);\n nodeRef.current = node;\n const liveRef = useRef(false);\n\n // useLayoutEffect y no useEffect: el hueco debe registrarse en el mismo\n // commit en que entra en el DOM, para que el anfitrion pinte su contenido sin\n // un frame intermedio en blanco.\n useLayoutEffect(() => {\n const el = elRef.current;\n if (!el) return;\n const id = idRef.current;\n liveRef.current = true;\n bridge.mount(id, el, nodeRef.current);\n return () => {\n liveRef.current = false;\n bridge.unmount(id);\n };\n // El hueco se monta una sola vez; los cambios de contenido van por `update`.\n }, []);\n\n // Sin deps a proposito: el nodo del anfitrion es un objeto nuevo en cada\n // render, asi que se reenvia siempre y el bridge decide si hay cambio real.\n useLayoutEffect(() => {\n if (liveRef.current) bridge.update(idRef.current, node);\n });\n\n return <div data-rsv=\"host\" ref={elRef} />;\n}\n\n/** Une clases base con las del usuario (filtra vacíos). */\nexport function cx(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/**\n * Invoca un hook `*DidMount` una única vez por elemento del DOM. Preact vuelve\n * a llamar a los callback refs en cada render, así que hace falta recordar qué\n * elementos ya se notificaron (FullCalendar tampoco re-dispara `*DidMount`).\n */\nconst notified = new WeakSet<HTMLElement>();\n\nexport function callDidMount<Arg extends { el: HTMLElement }>(\n el: Element | null,\n hook: ((arg: Arg) => void) | undefined,\n buildArg: () => Omit<Arg, \"el\">,\n): void {\n if (!el || !hook) return;\n const html = el as HTMLElement;\n if (notified.has(html)) return;\n notified.add(html);\n hook(Object.assign(buildArg(), { el: html }) as Arg);\n}\n","/** Entrada de `responsiveViews`: a partir de `breakpoint` px de ancho, usa `view`. */\nexport interface ResponsiveViewEntry {\n breakpoint: number;\n view: string;\n}\n\n/**\n * Resuelve qué vista corresponde a un ancho dado: el `breakpoint` más alto que\n * sea `<= width` (estilo media query `min-width`). Si `width` es menor que\n * todos los breakpoints, usa la vista del breakpoint más bajo (piso \"mobile\").\n */\nexport function pickResponsiveView(entries: ResponsiveViewEntry[], width: number): string | null {\n if (!entries.length) return null;\n const sorted = [...entries].sort((a, b) => a.breakpoint - b.breakpoint);\n let chosen = sorted[0]!.view;\n for (const entry of sorted) {\n if (width >= entry.breakpoint) chosen = entry.view;\n }\n return chosen;\n}\n","import { dl, getLocaleText, type CalendarApi } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions } from \"../types.js\";\nimport { cx } from \"../render/slots.js\";\n\nconst NAV_SYMBOLS = { prev: \"‹\", next: \"›\" } as const;\n/** Tokens que NO son vistas (no aparecen como pestañas). */\nconst NON_VIEW_TOKENS = new Set([\"\", \"title\", \"today\", \"prev\", \"next\"]);\n/** Vistas cuyo datepicker elige MES (resto: elige DÍA). */\nconst MONTH_VIEW_RE = /month|year/i;\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\n/** Icono de calendario junto al título. */\nfunction CalendarIcon(): VNode {\n return (\n <svg\n data-rsv=\"title-icon\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"1\" y=\"2.5\" width=\"12\" height=\"10.5\" rx=\"1.5\" />\n <line x1=\"1\" y1=\"5.5\" x2=\"13\" y2=\"5.5\" />\n <line x1=\"4.5\" y1=\"1\" x2=\"4.5\" y2=\"3.5\" />\n <line x1=\"9.5\" y1=\"1\" x2=\"9.5\" y2=\"3.5\" />\n </svg>\n );\n}\n\ninterface ToolbarProps {\n api: CalendarApi;\n title: string;\n activeView: string;\n options: ReserviCalendarOptions;\n}\n\n/** Vistas para la fila de pestañas: prop `views` o, en su defecto, tokens de `headerToolbar`. */\nfunction resolveViews(options: ReserviCalendarOptions): string[] {\n if (options.views?.length) return options.views;\n const tb = options.headerToolbar;\n if (!tb) return [];\n return [tb.start, tb.center, tb.end]\n .filter((s): s is string => Boolean(s))\n .flatMap((s) => s.split(/\\s+/))\n .flatMap((g) => g.split(\",\"))\n .filter((t) => !NON_VIEW_TOKENS.has(t));\n}\n\n/**\n * Toolbar de dos filas:\n * - Fila 1: slot de inicio (Filtrar/Personal del anfitrión) · navegación\n * (hoy ‹ título ›) · slot de fin + botón \"Añadir\" (opcional, vía props).\n * - Fila 2: pestañas de vista.\n *\n * El título abre un datepicker para saltar de fecha. En vistas de mes/año la\n * rejilla elige MES; en el resto (semana/día/lista) elige DÍA. Se abre también\n * con Ctrl+M y se cierra con Esc o clic fuera.\n */\nexport function Toolbar({ api, title, activeView, options }: ToolbarProps): VNode {\n const text = getLocaleText(options.locale);\n const startSlot = options.slots?.toolbarStart?.();\n const endSlot = options.slots?.toolbarEnd?.();\n const views = resolveViews(options);\n const monthMode = MONTH_VIEW_RE.test(activeView);\n const firstDay = options.firstDay ?? text.firstDay;\n\n const wrapRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n\n // Fecha seleccionada (para resaltar). Reactivo vía signals.\n const selected = dl.toDate(api.getDate());\n const nowRef = dl.toDate(options.now ? dl.from(options.now) : dl.now());\n\n // El mes/año mostrados en la rejilla (independientes de la navegación principal).\n const [viewYear, setViewYear] = useState(selected.getFullYear());\n const [viewMonth, setViewMonth] = useState(selected.getMonth());\n\n const monthShortFmt = new Intl.DateTimeFormat(options.locale, { month: \"short\" });\n const monthLongFmt = new Intl.DateTimeFormat(options.locale, { month: \"long\" });\n const dowFmt = new Intl.DateTimeFormat(options.locale, { weekday: \"short\" });\n const monthNames = Array.from({ length: 12 }, (_, i) =>\n monthShortFmt.format(new Date(2020, i, 1)),\n );\n\n const openPicker = (): void => {\n const d = dl.toDate(api.getDate());\n setViewYear(d.getFullYear());\n setViewMonth(d.getMonth());\n setOpen(true);\n };\n const shiftMonth = (delta: number): void => {\n const total = viewYear * 12 + viewMonth + delta;\n setViewYear(Math.floor(total / 12));\n setViewMonth(((total % 12) + 12) % 12);\n };\n const goto = (iso: string): void => {\n api.gotoDate(iso);\n setOpen(false);\n };\n\n // Ctrl+M abre · Esc cierra · clic fuera cierra.\n useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && (e.key === \"m\" || e.key === \"M\")) {\n e.preventDefault();\n openPicker();\n } else if (e.key === \"Escape\") {\n setOpen(false);\n }\n };\n const onPointer = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onPointer);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onPointer);\n };\n }, []);\n\n // Celdas (6×7) para el modo DÍA, alineadas a firstDay.\n const dayGrid = ((): { cells: Date[]; dows: string[] } => {\n if (monthMode) return { cells: [], dows: [] };\n const first = dl.from(`${viewYear}-${pad2(viewMonth + 1)}-01`);\n const offset = (dl.dayOfWeek(first) - firstDay + 7) % 7;\n const start = dl.subtract(first, { days: offset });\n const cells = Array.from({ length: 42 }, (_, i) => dl.toDate(dl.add(start, { days: i })));\n const dows = cells.slice(0, 7).map((d) => dowFmt.format(d));\n return { cells, dows };\n })();\n\n return (\n <div data-rsv=\"toolbar-wrap\" class={cx(options.classNames?.toolbar)} ref={wrapRef}>\n <div data-rsv=\"toolbar\">\n {/* Inicio: slot libre del anfitrión (Filtrar / Personal …) */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"start\">\n {startSlot}\n </div>\n\n {/* Navegación: hoy · ‹ título › */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"nav\">\n <button\n type=\"button\"\n data-rsv=\"button\"\n title={text.todayHint}\n aria-label={text.todayHint}\n onClick={() => api.today()}\n >\n {text.today}\n </button>\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-nav=\"prev\"\n title={text.prevHint}\n aria-label={text.prevHint}\n onClick={() => api.prev()}\n >\n {NAV_SYMBOLS.prev}\n </button>\n\n {/* Título = disparador del datepicker */}\n <div data-rsv=\"datepicker-anchor\">\n <button\n type=\"button\"\n data-rsv=\"title\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={`${title} · Ctrl+M`}\n onClick={() => (open ? setOpen(false) : openPicker())}\n >\n <CalendarIcon />\n {title}\n </button>\n\n {open && (\n <div\n data-rsv=\"datepicker\"\n data-rsv-mode={monthMode ? \"month\" : \"day\"}\n role=\"dialog\"\n aria-label={title}\n >\n <div data-rsv=\"dp-head\">\n <button\n type=\"button\"\n data-rsv=\"dp-nav\"\n aria-label={text.prev}\n onClick={() => (monthMode ? setViewYear((y) => y - 1) : shiftMonth(-1))}\n >\n {NAV_SYMBOLS.prev}\n </button>\n <span data-rsv=\"dp-label\">\n {monthMode\n ? viewYear\n : `${monthLongFmt.format(new Date(viewYear, viewMonth, 1))} ${viewYear}`}\n </span>\n <button\n type=\"button\"\n data-rsv=\"dp-nav\"\n aria-label={text.next}\n onClick={() => (monthMode ? setViewYear((y) => y + 1) : shiftMonth(1))}\n >\n {NAV_SYMBOLS.next}\n </button>\n </div>\n\n {monthMode ? (\n <div data-rsv=\"dp-grid\">\n {monthNames.map((label, i) => (\n <button\n type=\"button\"\n data-rsv=\"dp-month\"\n key={label}\n data-active={String(\n viewYear === selected.getFullYear() && i === selected.getMonth(),\n )}\n data-today={String(\n viewYear === nowRef.getFullYear() && i === nowRef.getMonth(),\n )}\n onClick={() => goto(`${viewYear}-${pad2(i + 1)}-01`)}\n >\n {label}\n </button>\n ))}\n </div>\n ) : (\n <div data-rsv=\"dp-days\">\n {dayGrid.dows.map((d, i) => (\n <div data-rsv=\"dp-dow\" key={`dow-${i}`}>\n {d}\n </div>\n ))}\n {dayGrid.cells.map((d) => {\n const iso = `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n return (\n <button\n type=\"button\"\n data-rsv=\"dp-day\"\n key={iso}\n data-other={String(d.getMonth() !== viewMonth)}\n data-active={String(\n d.getFullYear() === selected.getFullYear() &&\n d.getMonth() === selected.getMonth() &&\n d.getDate() === selected.getDate(),\n )}\n data-today={String(\n d.getFullYear() === nowRef.getFullYear() &&\n d.getMonth() === nowRef.getMonth() &&\n d.getDate() === nowRef.getDate(),\n )}\n onClick={() => goto(iso)}\n >\n {d.getDate()}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-nav=\"next\"\n title={text.nextHint}\n aria-label={text.nextHint}\n onClick={() => api.next()}\n >\n {NAV_SYMBOLS.next}\n </button>\n </div>\n\n {/* Fin: slot libre + botón \"Añadir\" (solo si se pasa onAddClick) */}\n <div data-rsv=\"toolbar-section\" data-rsv-area=\"end\">\n {endSlot}\n {options.onAddClick && (\n <button\n type=\"button\"\n data-rsv=\"button\"\n data-rsv-variant=\"primary\"\n onClick={options.onAddClick}\n >\n <span data-rsv=\"add-icon\" aria-hidden=\"true\">\n +\n </span>\n {options.addButtonText}\n </button>\n )}\n </div>\n </div>\n\n {/* Fila 2: pestañas de vista */}\n {views.length > 0 && (\n <div data-rsv=\"toolbar-views\" role=\"tablist\">\n {views.map((v) => (\n <button\n type=\"button\"\n data-rsv=\"view-tab\"\n key={v}\n role=\"tab\"\n aria-selected={v === activeView}\n data-active={String(v === activeView)}\n title={text.viewHint(text.views[v] ?? v)}\n onClick={() => api.changeView(v)}\n >\n {text.views[v] ?? v}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Formateadores de hora compartidos por las vistas. Por defecto Reservi usa\n * 24h (\"HH:mm\"); si el usuario aporta opciones de `Intl.DateTimeFormat`\n * (`eventTimeFormat` / `slotLabelFormat`), manda su formato.\n */\n\n/** Rellena a dos dígitos. */\nexport function pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n/** \"HH:mm\" a partir de minutos desde medianoche. */\nexport function minutesToLabel(minutes: number): string {\n const total = ((Math.round(minutes) % 1440) + 1440) % 1440;\n return `${pad2(Math.floor(total / 60))}:${pad2(total % 60)}`;\n}\n\n/** \"HH:mm:ss\" a partir de minutos desde medianoche (sin envolver a 24h). */\nexport function minutesToTimeString(minutes: number): string {\n const m = Math.max(0, Math.round(minutes));\n return `${pad2(Math.floor(m / 60))}:${pad2(m % 60)}:00`;\n}\n\n/**\n * Formateador de hora: usa `Intl` si hay opciones, y si no el 24h por defecto\n * que ya produce el núcleo. Devuelve null si no hay que sobreescribir nada.\n */\nexport function timeFormatter(\n locale: string,\n options: Intl.DateTimeFormatOptions | undefined,\n): ((date: Date) => string) | null {\n if (!options) return null;\n const fmt = new Intl.DateTimeFormat(locale, options);\n return (date: Date) => fmt.format(date);\n}\n\n/** Formateador de fecha para cabeceras; `false` significa \"sin texto\". */\nexport function dateFormatter(\n locale: string,\n options: Intl.DateTimeFormatOptions | false | undefined,\n fallback: Intl.DateTimeFormatOptions,\n): ((date: Date) => string) | null {\n if (options === false) return null;\n const fmt = new Intl.DateTimeFormat(locale, options ?? fallback);\n return (date: Date) => fmt.format(date);\n}\n","import { dl, type CalendarApi, type RsvDate } from \"@reservi/core\";\n\n/**\n * Navegación de \"nav links\": dispara `navLinkDay` y, por defecto, va a la vista\n * de día (timeGridDay o dayGridDay, la que esté registrada) en esa fecha.\n */\nexport function navLinkToDay(api: CalendarApi, date: RsvDate): void {\n api.trigger(\"navLinkDay\", { date });\n const target = api.hasView(\"timeGridDay\")\n ? \"timeGridDay\"\n : api.hasView(\"dayGridDay\")\n ? \"dayGridDay\"\n : null;\n if (target) {\n api.gotoDate(dl.toISOString(date));\n api.changeView(target);\n }\n}\n","/**\n * Movimiento de eventos por teclado (accesibilidad WCAG). No necesita geometría\n * de píxeles: mueve por incrementos fijos (días o snap de minutos), por lo que\n * es plenamente testeable. Usa moveEvent (validado) del núcleo.\n */\nimport {\n computeDrop,\n dl,\n timeStringToMinutes,\n type CalendarApi,\n type EventDef,\n type KeyboardAction,\n} from \"@reservi/core\";\n\nexport type GridKind = \"dayGrid\" | \"timeGrid\";\n\nconst DAY = 1440;\n\n/** Atajos por defecto (usados para cualquier acción sin override del usuario). */\nconst DEFAULT_SHORTCUTS: Record<KeyboardAction, string[]> = {\n moveLeft: [\"ArrowLeft\"],\n moveRight: [\"ArrowRight\"],\n moveUp: [\"ArrowUp\"],\n moveDown: [\"ArrowDown\"],\n activate: [\"Enter\", \" \"],\n};\n\ninterface KeydownOptions {\n api: CalendarApi;\n event: EventDef;\n kind: GridKind;\n snap?: string | undefined;\n /** Override de atajos (se mergea sobre `DEFAULT_SHORTCUTS` por acción). */\n shortcuts?: Partial<Record<KeyboardAction, string[]>> | undefined;\n}\n\n/** Resuelve qué acción corresponde a la tecla pulsada, según el mapa efectivo. */\nfunction resolveAction(\n key: string,\n shortcuts: Partial<Record<KeyboardAction, string[]>> | undefined,\n): KeyboardAction | null {\n const entries = Object.entries(DEFAULT_SHORTCUTS) as [KeyboardAction, string[]][];\n for (const [action, defaultKeys] of entries) {\n const keys = shortcuts?.[action] ?? defaultKeys;\n if (keys.includes(key)) return action;\n }\n return null;\n}\n\nexport function handleEventKeydown(e: KeyboardEvent, opts: KeydownOptions): void {\n const { api, event, kind } = opts;\n const snapMin = timeStringToMinutes(opts.snap ?? \"00:30\");\n const action = resolveAction(e.key, opts.shortcuts);\n if (!action) return; // tecla no gestionada\n\n if (action === \"activate\") {\n e.preventDefault();\n api.trigger(\"eventClick\", { event });\n return;\n }\n\n let deltaMin = 0;\n switch (action) {\n case \"moveLeft\":\n deltaMin = -DAY;\n break;\n case \"moveRight\":\n deltaMin = DAY;\n break;\n case \"moveUp\":\n deltaMin = kind === \"timeGrid\" ? -snapMin : -DAY * 7;\n break;\n case \"moveDown\":\n deltaMin = kind === \"timeGrid\" ? snapMin : DAY * 7;\n break;\n }\n\n e.preventDefault();\n const next = computeDrop(event.start, event.end, deltaMin, dl);\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(\"eventDrop\", { event: updated });\n }\n}\n","/**\n * Drag por puntero para dayGrid/mes: mover un evento entre días y seleccionar\n * un rango de días arrastrando. El cálculo de fechas usa el núcleo (computeDrop\n * + dl); aquí solo se hace hit-testing del DOM para saber sobre qué día se está.\n */\nimport { computeDrop, dl, type CalendarApi, type EventDef } from \"@reservi/core\";\n\nconst DAY = 1440;\nconst THRESHOLD = 4;\n\n/** Fecha (ISO) de la celda de día bajo el punto, o null. */\nfunction dateAtPoint(x: number, y: number): string | null {\n const el = document.elementFromPoint(x, y) as HTMLElement | null;\n return el?.closest<HTMLElement>('[data-rsv=\"day\"]')?.dataset.date ?? null;\n}\n\ninterface EventDragOptions {\n api: CalendarApi;\n event: EventDef;\n /** Fecha (ISO) de la celda donde empezó el arrastre. */\n sourceDate: string;\n /** Se llama si hubo arrastre real (para suprimir el click posterior). */\n onMoved?: () => void;\n}\n\n/** Arrastra un evento entre días (dayGrid/mes). */\nexport function startDayGridEventDrag(ev: PointerEvent, opts: EventDragOptions): void {\n ev.stopPropagation();\n const { api, event, sourceDate } = opts;\n const startX = ev.clientX;\n const startY = ev.clientY;\n let dragging = false;\n\n const onMove = (e: PointerEvent): void => {\n if (!dragging && Math.hypot(e.clientX - startX, e.clientY - startY) > THRESHOLD) {\n dragging = true;\n document.body.style.cursor = \"grabbing\";\n }\n };\n const onUp = (e: PointerEvent): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n document.body.style.cursor = \"\";\n if (!dragging) return;\n opts.onMoved?.();\n const target = dateAtPoint(e.clientX, e.clientY);\n if (!target) return;\n const deltaDays = dl.diff(dl.from(sourceDate), dl.from(target), \"day\");\n if (deltaDays === 0) return;\n const next = computeDrop(event.start, event.end, deltaDays * DAY, dl);\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(\"eventDrop\", { event: updated });\n }\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n\n/**\n * Selecciona un rango de días arrastrando. Solo actúa si hay arrastre real\n * (varios días); un click simple lo gestiona el `onClick` de la celda. Llama a\n * `onRangeSelect` cuando selecciona, para suprimir el click posterior.\n */\nexport function startDayRangeSelect(\n ev: PointerEvent,\n opts: { api: CalendarApi; startDate: string; onRangeSelect?: () => void },\n): void {\n const target = ev.target as HTMLElement;\n // No iniciar selección si se pulsa sobre un evento, el \"+N more\" o un nav-link.\n if (target.closest('[data-rsv=\"event\"], [data-rsv=\"more-anchor\"], [data-nav-link=\"true\"]')) {\n return;\n }\n const { api } = opts;\n let endStr = opts.startDate;\n let moved = false;\n\n const onMove = (e: PointerEvent): void => {\n const d = dateAtPoint(e.clientX, e.clientY);\n if (d && d !== opts.startDate) moved = true;\n if (d) endStr = d;\n };\n const onUp = (): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n if (!moved) return; // click simple → lo gestiona onClick\n opts.onRangeSelect?.();\n const a = dl.from(opts.startDate);\n const b = dl.from(endStr);\n const [lo, hi] = dl.isBefore(a, b) ? [a, b] : [b, a];\n // Fin exclusivo (+1 día), como FullCalendar.\n api.select(dl.toISOString(lo), dl.toISOString(dl.add(hi, { days: 1 })));\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nexport { _iterableToArrayLimit as default };","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bind = void 0;\nfunction bind(target, _a) {\n var type = _a.type, listener = _a.listener, options = _a.options;\n target.addEventListener(type, listener, options);\n return function unbind() {\n target.removeEventListener(type, listener, options);\n };\n}\nexports.bind = bind;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = void 0;\nvar bind_1 = require(\"./bind\");\nfunction toOptions(value) {\n if (typeof value === 'undefined') {\n return undefined;\n }\n if (typeof value === 'boolean') {\n return {\n capture: value,\n };\n }\n return value;\n}\nfunction getBinding(original, sharedOptions) {\n if (sharedOptions == null) {\n return original;\n }\n var binding = __assign(__assign({}, original), { options: __assign(__assign({}, toOptions(sharedOptions)), toOptions(original.options)) });\n return binding;\n}\nfunction bindAll(target, bindings, sharedOptions) {\n var unbinds = bindings.map(function (original) {\n var binding = getBinding(original, sharedOptions);\n return (0, bind_1.bind)(target, binding);\n });\n return function unbindAll() {\n unbinds.forEach(function (unbind) { return unbind(); });\n };\n}\nexports.bindAll = bindAll;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = exports.bind = void 0;\nvar bind_1 = require(\"./bind\");\nObject.defineProperty(exports, \"bind\", { enumerable: true, get: function () { return bind_1.bind; } });\nvar bind_all_1 = require(\"./bind-all\");\nObject.defineProperty(exports, \"bindAll\", { enumerable: true, get: function () { return bind_all_1.bindAll; } });\n","// pulling this into a separate file so adapter(s) that don't\n// need the honey pot can pay as little as possible for it.\nexport var honeyPotDataAttribute = 'data-pdnd-honey-pot';","import { honeyPotDataAttribute } from './honey-pot-data-attribute';\nexport function isHoneyPotElement(target) {\n return target instanceof Element && target.hasAttribute(honeyPotDataAttribute);\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { isHoneyPotElement } from './is-honey-pot-element';\nexport function getElementFromPointWithoutHoneypot(client) {\n // eslint-disable-next-line no-restricted-syntax\n var _document$elementsFro = document.elementsFromPoint(client.x, client.y),\n _document$elementsFro2 = _slicedToArray(_document$elementsFro, 2),\n top = _document$elementsFro2[0],\n second = _document$elementsFro2[1];\n if (!top) {\n return null;\n }\n if (isHoneyPotElement(top)) {\n return second !== null && second !== void 0 ? second : null;\n }\n return top;\n}","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","// Maximum possible z-index\n// https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index\nexport var maxZIndex = 2147483647;","/**\n * Resets user agent styles for `[popover]` elements.\n *\n * Browsers apply these defaults to popovers (per the WHATWG HTML spec rendering section):\n * - `inset: 0` + `margin: auto` → centers the popover in the viewport\n * - `border: solid` → visible border\n * - `padding: 0.25em` → internal spacing\n * - `overflow: auto` → scrollbars when content overflows\n * - `color: CanvasText` + `background-color: Canvas` → system theme colors\n *\n * This object neutralizes those defaults so the popover behaves like a plain\n * positioned `<div>`, matching the sizing of the legacy (non-popover)\n * fallback container exactly.\n *\n * **Width and height (`auto`)**\n *\n * `width` and `height` override the spec user agent value of `fit-content`\n * with `auto`.\n *\n * _Why?_\n *\n * - When a `[popover]` is sized with `fit-content` and contains a flex\n * container, Safari collapses any flex item that uses `overflow: auto`\n * to `0px`.\n * - Setting the popover's `width` and `height` to `auto` skips the `fit-content`\n * pass and avoids the bug in Safari\n * - Chromium and Firefox tolerate `fit-content` here, but `auto` is safe\n * everywhere and matches our non-popover path\n */\nexport var popoverResetUserAgentStyles = {\n inset: 'unset',\n border: 'none',\n padding: 0,\n margin: 0,\n overflow: 'visible',\n color: 'inherit',\n background: 'transparent',\n width: 'auto',\n height: 'auto'\n};","/** Provide a function that you only ever want to be called a single time */\nexport function once(fn) {\n var cache = null;\n return function wrapped() {\n if (!cache) {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var result = fn.apply(this, args);\n cache = {\n result: result\n };\n }\n return cache.result;\n };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\n/**\n * Returns `true` if the browser supports the Popover API (top-layer).\n *\n * When supported, elements with `popover=\"manual\"` can be promoted to the\n * browser's top layer via `element.showPopover()`, which is more reliable\n * than `z-index` for ensuring an element renders above everything else.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API\n */\nexport var supportsPopover = once(function supportsPopover() {\n return typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.showPopover === 'function';\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { bind, bindAll } from 'bind-event-listener';\nimport { maxZIndex } from '../util/max-z-index';\nimport { popoverResetUserAgentStyles } from '../util/popover-reset-styles';\nimport { supportsPopover } from '../util/supports-popover';\nimport { honeyPotDataAttribute } from './honey-pot-data-attribute';\nvar honeyPotSize = 2;\nvar halfHoneyPotSize = honeyPotSize / 2;\n\n/**\n * `clientX` and `clientY` can be in sub pixels (eg `2.332`)\n * However, browser hitbox testing is commonly do to the closest pixel.\n *\n * → https://issues.chromium.org/issues/40940531\n *\n * To be sure that the honey pot will be over the `client` position,\n * we `.floor()` `clientX` and`clientY` and then make it `2px` in size.\n **/\nfunction floorToClosestPixel(point) {\n return {\n x: Math.floor(point.x),\n y: Math.floor(point.y)\n };\n}\n\n/**\n * We want to make sure the honey pot sits around the users position.\n * This seemed to be the most resilient while testing.\n */\nfunction pullBackByHalfHoneyPotSize(point) {\n return {\n x: point.x - halfHoneyPotSize,\n y: point.y - halfHoneyPotSize\n };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingBackwardsOffScreen(point) {\n return {\n x: Math.max(point.x, 0),\n y: Math.max(point.y, 0)\n };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingForwardsOffScreen(point) {\n return {\n x: Math.min(point.x, window.innerWidth - honeyPotSize),\n y: Math.min(point.y, window.innerHeight - honeyPotSize)\n };\n}\n\n/**\n * Create a `2x2` `DOMRect` around the `client` position\n */\nfunction getHoneyPotRectFor(_ref) {\n var client = _ref.client;\n var point = preventGoingForwardsOffScreen(preventGoingBackwardsOffScreen(pullBackByHalfHoneyPotSize(floorToClosestPixel(client))));\n\n // When debugging, it is helpful to\n // make this element a bit bigger\n return DOMRect.fromRect({\n x: point.x,\n y: point.y,\n width: honeyPotSize,\n height: honeyPotSize\n });\n}\nfunction getRectStyles(_ref2) {\n var clientRect = _ref2.clientRect;\n return {\n left: \"\".concat(clientRect.left, \"px\"),\n top: \"\".concat(clientRect.top, \"px\"),\n width: \"\".concat(clientRect.width, \"px\"),\n height: \"\".concat(clientRect.height, \"px\")\n };\n}\nfunction isWithin(_ref3) {\n var client = _ref3.client,\n clientRect = _ref3.clientRect;\n return (\n // is within horizontal bounds\n client.x >= clientRect.x && client.x <= clientRect.x + clientRect.width &&\n // is within vertical bounds\n client.y >= clientRect.y && client.y <= clientRect.y + clientRect.height\n );\n}\n/**\n * The honey pot fix is designed to get around a painful bug in all browsers.\n *\n * [Overview](https://www.youtube.com/watch?v=udE9qbFTeQg)\n *\n * **Background**\n *\n * When a drag starts, browsers incorrectly think that the users pointer is\n * still depressed where the drag started. Any element that goes under this position\n * will be entered into, causing `\"mouseenter\"` events and `\":hover\"` styles to be applied.\n *\n * _This is a violation of the spec_\n *\n * > \"From the moment that the user agent is to initiate the drag-and-drop operation,\n * > until the end \tof the drag-and-drop operation, device input events\n * > (e.g. mouse and keyboard events) must be suppressed.\"\n * >\n * > - https://html.spec.whatwg.org/multipage/dnd.html#drag-and-drop-processing-model\n *\n * _Some impacts_\n *\n * - `\":hover\"` styles being applied where they shouldn't (looks messy)\n * - components such as tooltips responding to `\"mouseenter\"` can show during a drag,\n * and on an element the user isn't even over\n *\n * Bug: https://issues.chromium.org/issues/41129937\n *\n * **Honey pot fix**\n *\n * 1. Create an element where the browser thinks the depressed pointer is\n * to absorb the incorrect pointer events\n * 2. Remove that element when it is no longer needed\n */\nfunction mountHoneyPot(_ref4) {\n var initial = _ref4.initial;\n var element = document.createElement('div');\n element.setAttribute(honeyPotDataAttribute, 'true');\n\n // Using popover=\"manual\" to place the element in the browser's top layer.\n // This ensures the honey pot is visually on top of everything else,\n // including elements using z-index and other stacking contexts.\n // \"manual\" means no light dismiss — we manage the lifecycle ourselves.\n // Falls back to position:fixed + maxZIndex when the popover API is not available.\n if (supportsPopover()) {\n element.setAttribute('popover', 'manual');\n }\n\n // can shift during the drag thanks to Firefox\n var clientRect = getHoneyPotRectFor({\n client: initial\n });\n Object.assign(element.style, _objectSpread(_objectSpread({\n position: 'fixed'\n }, supportsPopover() ?\n // needs to come first as it has 'inset: unset' which\n // needs to be overridden by our top / left values\n popoverResetUserAgentStyles : {\n // Fallback: using maximum possible z-index so that this element\n // will always be on top of other positioned content.\n zIndex: maxZIndex\n }), {}, {\n // Setting a background color explicitly to avoid any inherited styles.\n // Looks like this could be `opacity: 0`, but worried that _might_\n // cause the element to be ignored on some platforms.\n // When debugging, set backgroundColor to something like \"red\".\n backgroundColor: 'transparent',\n // Being explicit to avoid inheriting styles\n padding: 0,\n margin: 0,\n boxSizing: 'border-box',\n // We want this element to absorb pointer events,\n // it's kind of the whole point 😉\n pointerEvents: 'auto'\n }, getRectStyles({\n clientRect: clientRect\n })));\n document.body.appendChild(element);\n if (supportsPopover()) {\n element.showPopover();\n }\n\n /**\n * 🦊 In firefox we can get `\"pointermove\"` events after the drag\n * has started, which is a spec violation.\n * The final `\"pointermove\"` will reveal where the \"depressed\" position\n * is for our honey pot fix.\n */\n var unbindPointerMove = bind(window, {\n type: 'pointermove',\n listener: function listener(event) {\n var client = {\n x: event.clientX,\n y: event.clientY\n };\n clientRect = getHoneyPotRectFor({\n client: client\n });\n Object.assign(element.style, getRectStyles({\n clientRect: clientRect\n }));\n },\n // using capture so we are less likely to be impacted by event stopping\n options: {\n capture: true\n }\n });\n return function finish(_ref5) {\n var current = _ref5.current;\n // Don't need this any more\n unbindPointerMove();\n\n // If the user is hover the honey pot, we remove it\n // so that the user can continue to interact with the page normally.\n if (isWithin({\n client: current,\n clientRect: clientRect\n })) {\n element.remove();\n return;\n }\n function cleanup() {\n unbindPostDragEvents();\n element.remove();\n }\n var unbindPostDragEvents = bindAll(window, [{\n type: 'pointerdown',\n listener: cleanup\n }, {\n type: 'pointermove',\n listener: cleanup\n }, {\n type: 'focusin',\n listener: cleanup\n }, {\n type: 'focusout',\n listener: cleanup\n },\n // a 'pointerdown' should happen before 'dragstart', but just being super safe\n {\n type: 'dragstart',\n listener: cleanup\n },\n // if the user has dragged something out of the window\n // and then is dragging something back into the window\n // the first events we will see are \"dragenter\" (and then \"dragover\").\n // So if we see any of these we need to clear the post drag fix.\n {\n type: 'dragenter',\n listener: cleanup\n }, {\n type: 'dragover',\n listener: cleanup\n }\n\n // Not adding a \"wheel\" event listener, as \"wheel\" by itself does not\n // resolve the bug.\n ], {\n // Using `capture` so less likely to be impacted by other code stopping events\n capture: true\n });\n };\n}\nexport function makeHoneyPotFix() {\n var latestPointerMove = null;\n function bindEvents() {\n // For sanity, only collecting this value from when events are first bound.\n // This prevents the case where a super old \"pointermove\" could be used\n // from a prior interaction.\n latestPointerMove = null;\n return bind(window, {\n type: 'pointermove',\n listener: function listener(event) {\n latestPointerMove = {\n x: event.clientX,\n y: event.clientY\n };\n },\n // listening for pointer move in capture phase\n // so we are less likely to be impacted by events being stopped.\n options: {\n capture: true\n }\n });\n }\n function getOnPostDispatch() {\n var finish = null;\n return function onPostEvent(_ref6) {\n var eventName = _ref6.eventName,\n payload = _ref6.payload;\n // We are adding the honey pot `onDragStart` so we don't\n // impact the creation of the native drag preview.\n if (eventName === 'onDragStart') {\n var input = payload.location.initial.input;\n\n // Sometimes there will be no latest \"pointermove\" (eg iOS).\n // In which case, we use the start position of the drag.\n var initial = latestPointerMove !== null && latestPointerMove !== void 0 ? latestPointerMove : {\n x: input.clientX,\n y: input.clientY\n };\n\n // Don't need to defensively call `finish()` as `onDrop` from\n // one interaction is guaranteed to be called before `onDragStart`\n // of the next.\n finish = mountHoneyPot({\n initial: initial\n });\n }\n if (eventName === 'onDrop') {\n var _finish;\n var _input = payload.location.current.input;\n (_finish = finish) === null || _finish === void 0 || _finish({\n current: {\n x: _input.clientX,\n y: _input.clientY\n }\n });\n finish = null;\n // this interaction is finished, we want to use\n // the latest \"pointermove\" for each interaction\n latestPointerMove = null;\n }\n };\n }\n return {\n bindEvents: bindEvents,\n getOnPostDispatch: getOnPostDispatch\n };\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import { once } from '../public-utils/once';\n\n// using `cache` as our `isFirefox()` result will not change in a browser\n\n/**\n * Returns `true` if a `Firefox` browser\n * */\nexport var isFirefox = once(function isFirefox() {\n if (process.env.NODE_ENV === 'test') {\n return false;\n }\n return navigator.userAgent.includes('Firefox');\n});","import { once } from '../public-utils/once';\n\n// using `cache` as our `isSafari()` result will not change in a browser\n\n/**\n * Returns `true` if a `Safari` browser.\n * Returns `true` if the browser is running on iOS (they are all Safari).\n *\n * Use `isSafariOnIOS` if you want to check if something is Safari + iOS\n * */\nexport var isSafari = once(function isSafari() {\n if (process.env.NODE_ENV === 'test') {\n return false;\n }\n var _navigator = navigator,\n userAgent = _navigator.userAgent;\n return userAgent.includes('AppleWebKit') && !userAgent.includes('Chrome');\n});","/**\n * Does the `EventTarget` look like a `Node` based on \"duck typing\".\n *\n * Helpful when the `Node` might be outside of the current document\n * so we cannot to an `target instanceof Node` check.\n */\nfunction isNodeLike(target) {\n return 'nodeName' in target;\n}\n\n/**\n * Is an `EventTarget` a `Node` from another `window`?\n */\nexport function isFromAnotherWindow(eventTarget) {\n return isNodeLike(eventTarget) && eventTarget.ownerDocument !== document;\n}","import { bindAll } from 'bind-event-listener';\nimport { isSafari } from '../is-safari';\n\n/* For \"dragenter\" events, the browser should set `relatedTarget` to the previous element.\n * For external drag operations, our first \"dragenter\" event should have a `event.relatedTarget` of `null`.\n *\n * Unfortunately in Safari `event.relatedTarget` is *always* set to `null`\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=242627\n * To work around this we count \"dragenter\" and \"dragleave\" events */\n// Using symbols for event properties so we don't clash with\n// anything on the `event` object\nexport var symbols = {\n isLeavingWindow: Symbol('leaving'),\n isEnteringWindow: Symbol('entering')\n};\n(function fixSafari() {\n // Don't do anything when server side rendering\n if (typeof window === 'undefined') {\n return;\n }\n\n // rather than checking the userAgent for \"jsdom\" we can do this check\n // so that the check will be removed completely in production code\n if (process.env.NODE_ENV === 'test') {\n return;\n }\n if (!isSafari()) {\n return;\n }\n function getInitialState() {\n return {\n enterCount: 0,\n isOverWindow: false\n };\n }\n var state = getInitialState();\n function resetState() {\n state = getInitialState();\n }\n\n // These event listeners are bound _forever_ and _never_ removed\n // We don't bother cleaning up these event listeners (for now)\n // as this workaround is only for Safari\n\n // This is how the event count works:\n //\n // lift (+1 enterCount)\n // - dragstart(draggable) [enterCount: 0]\n // - dragenter(draggable) [enterCount: 1]\n // leaving draggable (+0 enterCount)\n // - dragenter(document.body) [enterCount: 2]\n // - dragleave(draggable) [enterCount: 1]\n // leaving window (-1 enterCount)\n // - dragleave(document.body) [enterCount: 0] {leaving the window}\n\n // Things to note:\n // - dragenter and dragleave bubble\n // - the first dragenter when entering a window might not be on `window`\n // - it could be on an element that is pressed up against the window\n // - (so we cannot rely on `event.target` values)\n\n bindAll(window, [{\n type: 'dragstart',\n listener: function listener() {\n state.enterCount = 0;\n // drag start occurs in the source window\n state.isOverWindow = true;\n // When a drag first starts it will also trigger a \"dragenter\" on the draggable element\n }\n }, {\n type: 'drop',\n listener: resetState\n }, {\n type: 'dragend',\n listener: resetState\n }, {\n type: 'dragenter',\n listener: function listener(event) {\n if (!state.isOverWindow && state.enterCount === 0) {\n // Patching the `event` object\n // The `event` object is shared with all event listeners for the event\n event[symbols.isEnteringWindow] = true;\n }\n state.isOverWindow = true;\n state.enterCount++;\n }\n }, {\n type: 'dragleave',\n listener: function listener(event) {\n state.enterCount--;\n if (state.isOverWindow && state.enterCount === 0) {\n // Patching the `event` object as it is shared with all event listeners\n // The `event` object is shared with all event listeners for the event\n event[symbols.isLeavingWindow] = true;\n state.isOverWindow = false;\n }\n }\n }],\n // using `capture: true` so that adding event listeners\n // in bubble phase will have the correct symbols\n {\n capture: true\n });\n})();","import { isSafari } from '../is-safari';\nimport { symbols } from './count-events-for-safari';\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function isLeavingWindowInSafari(_ref) {\n var dragLeave = _ref.dragLeave;\n if (!isSafari()) {\n return false;\n }\n return dragLeave.hasOwnProperty(symbols.isLeavingWindow);\n}","import { isFirefox } from '../is-firefox';\nimport { isSafari } from '../is-safari';\nimport { isFromAnotherWindow } from './is-from-another-window';\nimport { isLeavingWindowInSafari } from './is-leaving-window-in-safari';\nexport function isLeavingWindow(_ref) {\n var dragLeave = _ref.dragLeave;\n var type = dragLeave.type,\n relatedTarget = dragLeave.relatedTarget;\n if (type !== 'dragleave') {\n return false;\n }\n if (isSafari()) {\n return isLeavingWindowInSafari({\n dragLeave: dragLeave\n });\n }\n\n // Standard check: if going to `null` we are leaving the `window`\n if (relatedTarget == null) {\n return true;\n }\n\n /**\n * 🦊 Exception: `iframe` in Firefox (`125.0`)\n *\n * Case 1: parent `window` → child `iframe`\n * `dragLeave.relatedTarget` is element _inside_ the child `iframe`\n * (foreign element)\n *\n * Case 2: child `iframe` → parent `window`\n * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n * (foreign element)\n */\n\n if (isFirefox()) {\n return isFromAnotherWindow(relatedTarget);\n }\n\n /**\n * 🌏 Exception: `iframe` in Chrome (`124.0`)\n *\n * Case 1: parent `window` → child `iframe`\n * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n *\n * Case 2: child `iframe` → parent `window`\n * `dragLeave.relatedTarget` is `null` *(standard check)*\n */\n\n // Case 2\n // Using `instanceof` check as the element will be in the same `window`\n return relatedTarget instanceof HTMLIFrameElement;\n}","export function getBindingsForBrokenDrags(_ref) {\n var onDragEnd = _ref.onDragEnd;\n return [\n // ## Detecting drag ending for removed draggables\n //\n // If a draggable element is removed during a drag and the user drops:\n // 1. if over a valid drop target: we get a \"drop\" event to know the drag is finished\n // 2. if not over a valid drop target (or cancelled): we get nothing\n // The \"dragend\" event will not fire on the source draggable if it has been\n // removed from the DOM.\n // So we need to figure out if a drag operation has finished by looking at other events\n // We can do this by looking at other events\n\n // ### First detection: \"pointermove\" events\n\n // 1. \"pointermove\" events cannot fire during a drag and drop operation\n // according to the spec. So if we get a \"pointermove\" it means that\n // the drag and drop operations has finished. So if we get a \"pointermove\"\n // we know that the drag is over\n // 2. 🦊😤 Drag and drop operations are _supposed_ to suppress\n // other pointer events. However, firefox will allow a few\n // pointer event to get through after a drag starts.\n // The most I've seen is 3\n {\n type: 'pointermove',\n listener: function () {\n var callCount = 0;\n return function listener() {\n // Using 20 as it is far bigger than the most observed (3)\n if (callCount < 20) {\n callCount++;\n return;\n }\n onDragEnd();\n };\n }()\n },\n // ### Second detection: \"pointerdown\" events\n\n // If we receive this event then we know that a drag operation has finished\n // and potentially another one is about to start.\n // Note: `pointerdown` fires on all browsers / platforms before \"dragstart\"\n {\n type: 'pointerdown',\n listener: onDragEnd\n }];\n}","export function getInput(event) {\n return {\n altKey: event.altKey,\n button: event.button,\n buttons: event.buttons,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY\n };\n}","var rafSchd = function rafSchd(fn) {\n var lastArgs = [];\n var frameId = null;\n\n var wrapperFn = function wrapperFn() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n\n if (frameId) {\n return;\n }\n\n frameId = requestAnimationFrame(function () {\n frameId = null;\n fn.apply(void 0, lastArgs);\n });\n };\n\n wrapperFn.cancel = function () {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n };\n\n return wrapperFn;\n};\n\nexport default rafSchd;\n","import rafSchd from 'raf-schd';\nvar scheduleOnDrag = rafSchd(function (fn) {\n return fn();\n});\nvar dragStart = function () {\n var scheduled = null;\n function schedule(fn) {\n var frameId = requestAnimationFrame(function () {\n scheduled = null;\n fn();\n });\n scheduled = {\n frameId: frameId,\n fn: fn\n };\n }\n function flush() {\n if (scheduled) {\n cancelAnimationFrame(scheduled.frameId);\n scheduled.fn();\n scheduled = null;\n }\n }\n return {\n schedule: schedule,\n flush: flush\n };\n}();\nexport function makeDispatch(_ref) {\n var source = _ref.source,\n initial = _ref.initial,\n dispatchEvent = _ref.dispatchEvent;\n var previous = {\n dropTargets: []\n };\n function safeDispatch(args) {\n dispatchEvent(args);\n previous = {\n dropTargets: args.payload.location.current.dropTargets\n };\n }\n var dispatch = {\n start: function start(_ref2) {\n var nativeSetDragImage = _ref2.nativeSetDragImage;\n // Ensuring that both `onGenerateDragPreview` and `onDragStart` get the same location.\n // We do this so that `previous` is`[]` in `onDragStart` (which is logical)\n var location = {\n current: initial,\n previous: previous,\n initial: initial\n };\n // a `onGenerateDragPreview` does _not_ add another entry for `previous`\n // onDragPreview\n safeDispatch({\n eventName: 'onGenerateDragPreview',\n payload: {\n source: source,\n location: location,\n nativeSetDragImage: nativeSetDragImage\n }\n });\n dragStart.schedule(function () {\n safeDispatch({\n eventName: 'onDragStart',\n payload: {\n source: source,\n location: location\n }\n });\n });\n },\n dragUpdate: function dragUpdate(_ref3) {\n var current = _ref3.current;\n dragStart.flush();\n scheduleOnDrag.cancel();\n safeDispatch({\n eventName: 'onDropTargetChange',\n payload: {\n source: source,\n location: {\n initial: initial,\n previous: previous,\n current: current\n }\n }\n });\n },\n drag: function drag(_ref4) {\n var current = _ref4.current;\n scheduleOnDrag(function () {\n dragStart.flush();\n var location = {\n initial: initial,\n previous: previous,\n current: current\n };\n safeDispatch({\n eventName: 'onDrag',\n payload: {\n source: source,\n location: location\n }\n });\n });\n },\n drop: function drop(_ref5) {\n var current = _ref5.current,\n updatedSourcePayload = _ref5.updatedSourcePayload;\n dragStart.flush();\n scheduleOnDrag.cancel();\n safeDispatch({\n eventName: 'onDrop',\n payload: {\n source: updatedSourcePayload !== null && updatedSourcePayload !== void 0 ? updatedSourcePayload : source,\n location: {\n current: current,\n previous: previous,\n initial: initial\n }\n }\n });\n }\n };\n return dispatch;\n}","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport { bindAll } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { isHoneyPotElement } from '../honey-pot-fix/is-honey-pot-element';\nimport { isLeavingWindow } from '../util/changing-window/is-leaving-window';\nimport { getBindingsForBrokenDrags } from '../util/detect-broken-drag';\nimport { getInput } from '../util/get-input';\nimport { makeDispatch } from './dispatch-consumer-event';\nvar globalState = {\n isActive: false\n};\nfunction canStart() {\n return !globalState.isActive;\n}\nfunction getNativeSetDragImage(event) {\n if (event.dataTransfer) {\n // need to use `.bind` as `setDragImage` is required\n // to be run with `event.dataTransfer` as the \"this\" context\n return event.dataTransfer.setDragImage.bind(event.dataTransfer);\n }\n return null;\n}\nfunction hasHierarchyChanged(_ref) {\n var current = _ref.current,\n next = _ref.next;\n if (current.length !== next.length) {\n return true;\n }\n // not checking stickiness, data or dropEffect,\n // just whether the hierarchy has changed\n for (var i = 0; i < current.length; i++) {\n if (current[i].element !== next[i].element) {\n return true;\n }\n }\n return false;\n}\nfunction start(_ref2) {\n var event = _ref2.event,\n dragType = _ref2.dragType,\n getDropTargetsOver = _ref2.getDropTargetsOver,\n dispatchEvent = _ref2.dispatchEvent;\n if (!canStart()) {\n return;\n }\n var initial = getStartLocation({\n event: event,\n dragType: dragType,\n getDropTargetsOver: getDropTargetsOver\n });\n globalState.isActive = true;\n var state = {\n current: initial\n };\n\n // Setting initial drop effect for the drag\n setDropEffectOnEvent({\n event: event,\n current: initial.dropTargets\n });\n var dispatch = makeDispatch({\n source: dragType.payload,\n dispatchEvent: dispatchEvent,\n initial: initial\n });\n function updateState(next) {\n // only looking at whether hierarchy has changed to determine whether something as 'changed'\n var hasChanged = hasHierarchyChanged({\n current: state.current.dropTargets,\n next: next.dropTargets\n });\n\n // Always updating the state to include latest data, dropEffect and stickiness\n // Only updating consumers if the hierarchy has changed in some way\n // Consumers can get the latest data by using `onDrag`\n state.current = next;\n if (hasChanged) {\n dispatch.dragUpdate({\n current: state.current\n });\n }\n }\n function onUpdateEvent(event) {\n var input = getInput(event);\n\n // If we are over the honey pot, we need to get the element\n // that the user would have been over if not for the honey pot\n var target = isHoneyPotElement(event.target) ? getElementFromPointWithoutHoneypot({\n x: input.clientX,\n y: input.clientY\n }) : event.target;\n var nextDropTargets = getDropTargetsOver({\n target: target,\n input: input,\n source: dragType.payload,\n current: state.current.dropTargets\n });\n if (nextDropTargets.length) {\n // 🩸 must call `event.preventDefault()` to allow a browser drop to occur\n event.preventDefault();\n setDropEffectOnEvent({\n event: event,\n current: nextDropTargets\n });\n }\n updateState({\n dropTargets: nextDropTargets,\n input: input\n });\n }\n function cancel() {\n // The spec behaviour is that when a drag is cancelled, or when dropping on no drop targets,\n // a \"dragleave\" event is fired on the active drop target before a \"dragend\" event.\n // We are replicating that behaviour in `cancel` if there are any active drop targets to\n // ensure consistent behaviour.\n //\n // Note: When cancelling, or dropping on no drop targets, a \"dragleave\" event\n // will have already cleared the dropTargets to `[]` (as that particular \"dragleave\" has a `relatedTarget` of `null`)\n\n if (state.current.dropTargets.length) {\n updateState({\n dropTargets: [],\n input: state.current.input\n });\n }\n dispatch.drop({\n current: state.current,\n updatedSourcePayload: null\n });\n finish();\n }\n function finish() {\n globalState.isActive = false;\n unbindEvents();\n }\n var unbindEvents = bindAll(window, [{\n // 👋 Note: we are repurposing the `dragover` event as our `drag` event\n // this is because firefox does not publish pointer coordinates during\n // a `drag` event, but does for every other type of drag event\n // `dragover` fires on all elements that are being dragged over\n // Because we are binding to `window` - our `dragover` is effectively the same as a `drag`\n // 🦊😤\n type: 'dragover',\n listener: function listener(event) {\n // We need to regularly calculate the drop targets in order to allow:\n // - dynamic `canDrop()` checks\n // - rapid updating `getData()` calls to attach data in response to user input (eg for edge detection)\n // Sadly we cannot schedule inspecting changes resulting from this event\n // we need to be able to conditionally cancel the event with `event.preventDefault()`\n // to enable the correct native drop experience.\n\n // 1. check to see if anything has changed\n onUpdateEvent(event);\n\n // 2. let consumers know a move has occurred\n // This will include the latest 'input' values\n dispatch.drag({\n current: state.current\n });\n }\n }, {\n type: 'dragenter',\n listener: onUpdateEvent\n }, {\n type: 'dragleave',\n listener: function listener(event) {\n if (!isLeavingWindow({\n dragLeave: event\n })) {\n return;\n }\n\n /**\n * At this point we don't know if a drag is being cancelled,\n * or if a drag is leaving the `window`.\n *\n * Both have:\n * 1. \"dragleave\" (with `relatedTarget: null`)\n * 2. \"dragend\" (a \"dragend\" can occur when outside the `window`)\n *\n * **Clearing drop targets**\n *\n * For either case we are clearing the the drop targets\n *\n * - cancelling: we clear drop targets in `\"dragend\"` anyway\n * - leaving the `window`: we clear the drop targets (to clear stickiness)\n *\n * **Leaving the window and finishing the drag**\n *\n * _internal drags_\n *\n * - The drag continues when the user is outside the `window`\n * and can resume if the user drags back over the `window`,\n * or end when the user drops in an external `window`.\n * - We will get a `\"dragend\"`, or we can listen for other\n * events to determine the drag is finished when the user re-enters the `window`).\n *\n * _external drags_\n *\n * - We conclude the drag operation.\n * - We have no idea if the user will drag back over the `window`,\n * or if the drag ends elsewhere.\n * - We will create a new drag if the user re-enters the `window`.\n *\n * **Not updating `input`**\n *\n * 🐛 Bug[Chrome] the final `\"dragleave\"` has default input values (eg `clientX == 0`)\n * Workaround: intentionally not updating `input` in \"dragleave\"\n * rather than the users current input values\n * - [Conversation](https://twitter.com/alexandereardon/status/1642697633864241152)\n * - [Bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1429937)\n **/\n\n updateState({\n input: state.current.input,\n dropTargets: []\n });\n if (dragType.startedFrom === 'external') {\n cancel();\n }\n }\n }, {\n // A \"drop\" can only happen if the browser allowed the drop\n type: 'drop',\n listener: function listener(event) {\n // Capture the final input.\n // We are capturing the final `input` for the\n // most accurate honey pot experience\n state.current = {\n dropTargets: state.current.dropTargets,\n input: getInput(event)\n };\n\n /** If there are no drop targets, then we will get\n * a \"drop\" event if:\n * - `preventUnhandled()` is being used\n * - there is an unmanaged drop target (eg another library)\n * In these cases, it's up to the consumer\n * to handle the drop if it's not over one of our drop targets\n * - `preventUnhandled()` will cancel the \"drop\"\n * - unmanaged drop targets can handle the \"drop\" how they want to\n * We won't call `event.preventDefault()` in this call path */\n\n if (!state.current.dropTargets.length) {\n cancel();\n return;\n }\n event.preventDefault();\n\n // applying the latest drop effect to the event\n setDropEffectOnEvent({\n event: event,\n current: state.current.dropTargets\n });\n dispatch.drop({\n current: state.current,\n // When dropping something native, we need to extract the latest\n // `.items` from the \"drop\" event as it is now accessible\n updatedSourcePayload: dragType.type === 'external' ? dragType.getDropPayload(event) : null\n });\n finish();\n }\n }, {\n // \"dragend\" fires when on the drag source (eg a draggable element)\n // when the drag is finished.\n // \"dragend\" will fire after \"drop\" (if there was a successful drop)\n // \"dragend\" does not fire if the draggable source has been removed during the drag\n // or for external drag sources (eg files)\n\n // This \"dragend\" listener will not fire if there was a successful drop\n // as we will have already removed the event listener\n\n type: 'dragend',\n listener: function listener(event) {\n // In firefox, the position of the \"dragend\" event can\n // be a bit different to the last \"dragover\" event.\n // Updating the input so we can get the best possible\n // information for the honey pot.\n state.current = {\n dropTargets: state.current.dropTargets,\n input: getInput(event)\n };\n cancel();\n }\n }].concat(_toConsumableArray(getBindingsForBrokenDrags({\n onDragEnd: cancel\n }))),\n // Once we have started a managed drag operation it is important that we see / own all drag events\n // We got one adoption bug pop up where some code was stopping (`event.stopPropagation()`)\n // all \"drop\" events in the bubble phase on the `document.body`.\n // This meant that we never saw the \"drop\" event.\n {\n capture: true\n });\n dispatch.start({\n nativeSetDragImage: getNativeSetDragImage(event)\n });\n}\nfunction setDropEffectOnEvent(_ref3) {\n var _current$;\n var event = _ref3.event,\n current = _ref3.current;\n // setting the `dropEffect` to be the innerMost drop targets dropEffect\n var innerMost = (_current$ = current[0]) === null || _current$ === void 0 ? void 0 : _current$.dropEffect;\n if (innerMost != null && event.dataTransfer) {\n event.dataTransfer.dropEffect = innerMost;\n }\n}\nfunction getStartLocation(_ref4) {\n var event = _ref4.event,\n dragType = _ref4.dragType,\n getDropTargetsOver = _ref4.getDropTargetsOver;\n var input = getInput(event);\n\n // When dragging from outside of the browser,\n // the drag is not being sourced from any local drop targets\n if (dragType.startedFrom === 'external') {\n return {\n input: input,\n dropTargets: []\n };\n }\n var dropTargets = getDropTargetsOver({\n input: input,\n source: dragType.payload,\n target: event.target,\n current: []\n });\n return {\n input: input,\n dropTargets: dropTargets\n };\n}\nexport var lifecycle = {\n canStart: canStart,\n start: start\n};","// Extending `Map` to allow us to link Key and Values together\n\nvar ledger = new Map();\nfunction registerUsage(_ref) {\n var typeKey = _ref.typeKey,\n mount = _ref.mount;\n var entry = ledger.get(typeKey);\n if (entry) {\n entry.usageCount++;\n return entry;\n }\n var initial = {\n typeKey: typeKey,\n unmount: mount(),\n usageCount: 1\n };\n ledger.set(typeKey, initial);\n return initial;\n}\nexport function register(args) {\n var entry = registerUsage(args);\n return function unregister() {\n entry.usageCount--;\n if (entry.usageCount > 0) {\n return;\n }\n // Only a single usage left, remove it\n entry.unmount();\n ledger.delete(args.typeKey);\n };\n}","/** Create a new combined function that will call all the provided functions */\nexport function combine() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n return function cleanup() {\n fns.forEach(function (fn) {\n return fn();\n });\n };\n}","export function addAttribute(element, _ref) {\n var attribute = _ref.attribute,\n value = _ref.value;\n element.setAttribute(attribute, value);\n return function () {\n return element.removeAttribute(attribute);\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nfunction copyReverse(array) {\n return array.slice(0).reverse();\n}\nexport function makeDropTarget(_ref) {\n var typeKey = _ref.typeKey,\n defaultDropEffect = _ref.defaultDropEffect;\n var registry = new WeakMap();\n var dropTargetDataAtt = \"data-drop-target-for-\".concat(typeKey);\n var dropTargetSelector = \"[\".concat(dropTargetDataAtt, \"]\");\n function addToRegistry(args) {\n registry.set(args.element, args);\n return function () {\n return registry.delete(args.element);\n };\n }\n function dropTargetForConsumers(args) {\n // Guardrail: warn if the draggable element is already registered\n if (process.env.NODE_ENV !== 'production') {\n var existing = registry.get(args.element);\n if (existing) {\n // eslint-disable-next-line no-console\n console.warn(\"You have already registered a [\".concat(typeKey, \"] dropTarget on the same element\"), {\n existing: existing,\n proposed: args\n });\n }\n if (args.element instanceof HTMLIFrameElement) {\n // eslint-disable-next-line no-console\n console.warn(\"\\n We recommend not registering <iframe> elements as drop targets\\n as it can result in some strange browser event ordering.\\n \" // Removing newlines and excessive whitespace\n .replace(/\\s{2,}/g, ' ').trim());\n }\n }\n var cleanup = combine(addAttribute(args.element, {\n attribute: dropTargetDataAtt,\n value: 'true'\n }), addToRegistry(args));\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n }\n function getActualDropTargets(_ref2) {\n var _args$getData, _args$getData2, _args$getDropEffect, _args$getDropEffect2;\n var source = _ref2.source,\n target = _ref2.target,\n input = _ref2.input,\n _ref2$result = _ref2.result,\n result = _ref2$result === void 0 ? [] : _ref2$result;\n if (target == null) {\n return result;\n }\n if (!(target instanceof Element)) {\n // For \"text-selection\" drags, the original `target`\n // is not an `Element`, so we need to start looking from\n // the parent element\n if (target instanceof Node) {\n return getActualDropTargets({\n source: source,\n target: target.parentElement,\n input: input,\n result: result\n });\n }\n\n // not sure what we are working with,\n // so we can exit.\n return result;\n }\n var closest = target.closest(dropTargetSelector);\n\n // Cannot find anything else\n if (closest == null) {\n return result;\n }\n var args = registry.get(closest);\n\n // error: something had a dropTargetSelector but we could not\n // find a match. For now, failing silently\n if (args == null) {\n return result;\n }\n var feedback = {\n input: input,\n source: source,\n element: args.element\n };\n\n // if dropping is not allowed, skip this drop target\n // and continue looking up the DOM tree\n if (args.canDrop && !args.canDrop(feedback)) {\n return getActualDropTargets({\n source: source,\n target: args.element.parentElement,\n input: input,\n result: result\n });\n }\n\n // calculate our new record\n var data = (_args$getData = (_args$getData2 = args.getData) === null || _args$getData2 === void 0 ? void 0 : _args$getData2.call(args, feedback)) !== null && _args$getData !== void 0 ? _args$getData : {};\n var dropEffect = (_args$getDropEffect = (_args$getDropEffect2 = args.getDropEffect) === null || _args$getDropEffect2 === void 0 ? void 0 : _args$getDropEffect2.call(args, feedback)) !== null && _args$getDropEffect !== void 0 ? _args$getDropEffect : defaultDropEffect;\n var record = {\n data: data,\n element: args.element,\n dropEffect: dropEffect,\n // we are collecting _actual_ drop targets, so these are\n // being applied _not_ due to stickiness\n isActiveDueToStickiness: false\n };\n return getActualDropTargets({\n source: source,\n target: args.element.parentElement,\n input: input,\n // Using bubble ordering. Same ordering as `event.getPath()`\n result: [].concat(_toConsumableArray(result), [record])\n });\n }\n function notifyCurrent(_ref3) {\n var eventName = _ref3.eventName,\n payload = _ref3.payload;\n var _iterator = _createForOfIteratorHelper(payload.location.current.dropTargets),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _entry$eventName;\n var record = _step.value;\n var entry = registry.get(record.element);\n var args = _objectSpread(_objectSpread({}, payload), {}, {\n self: record\n });\n entry === null || entry === void 0 || (_entry$eventName = entry[eventName]) === null || _entry$eventName === void 0 || _entry$eventName.call(entry,\n // I cannot seem to get the types right here.\n // TS doesn't seem to like that one event can need `nativeSetDragImage`\n // @ts-expect-error\n args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n var actions = {\n onGenerateDragPreview: notifyCurrent,\n onDrag: notifyCurrent,\n onDragStart: notifyCurrent,\n onDrop: notifyCurrent,\n onDropTargetChange: function onDropTargetChange(_ref4) {\n var payload = _ref4.payload;\n var isCurrent = new Set(payload.location.current.dropTargets.map(function (record) {\n return record.element;\n }));\n var visited = new Set();\n var _iterator2 = _createForOfIteratorHelper(payload.location.previous.dropTargets),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _entry$onDropTargetCh;\n var record = _step2.value;\n visited.add(record.element);\n var entry = registry.get(record.element);\n var isOver = isCurrent.has(record.element);\n var args = _objectSpread(_objectSpread({}, payload), {}, {\n self: record\n });\n entry === null || entry === void 0 || (_entry$onDropTargetCh = entry.onDropTargetChange) === null || _entry$onDropTargetCh === void 0 || _entry$onDropTargetCh.call(entry, args);\n\n // if we cannot find the drop target in the current array, then it has been left\n if (!isOver) {\n var _entry$onDragLeave;\n entry === null || entry === void 0 || (_entry$onDragLeave = entry.onDragLeave) === null || _entry$onDragLeave === void 0 || _entry$onDragLeave.call(entry, args);\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n var _iterator3 = _createForOfIteratorHelper(payload.location.current.dropTargets),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var _entry$onDropTargetCh2, _entry$onDragEnter;\n var _record = _step3.value;\n // already published an update to this drop target\n if (visited.has(_record.element)) {\n continue;\n }\n // at this point we have a new drop target that is being entered into\n var _args = _objectSpread(_objectSpread({}, payload), {}, {\n self: _record\n });\n var _entry = registry.get(_record.element);\n _entry === null || _entry === void 0 || (_entry$onDropTargetCh2 = _entry.onDropTargetChange) === null || _entry$onDropTargetCh2 === void 0 || _entry$onDropTargetCh2.call(_entry, _args);\n _entry === null || _entry === void 0 || (_entry$onDragEnter = _entry.onDragEnter) === null || _entry$onDragEnter === void 0 || _entry$onDragEnter.call(_entry, _args);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n };\n function dispatchEvent(args) {\n actions[args.eventName](args);\n }\n function getIsOver(_ref5) {\n var source = _ref5.source,\n target = _ref5.target,\n input = _ref5.input,\n current = _ref5.current;\n var actual = getActualDropTargets({\n source: source,\n target: target,\n input: input\n });\n\n // stickiness is only relevant when we have less\n // drop targets than we did before\n if (actual.length >= current.length) {\n return actual;\n }\n\n // less 'actual' drop targets than before,\n // we need to see if 'stickiness' applies\n\n // An old drop target will continue to be dropped on if:\n // 1. it has the same parent\n // 2. nothing exists in it's previous index\n\n var lastCaptureOrdered = copyReverse(current);\n var actualCaptureOrdered = copyReverse(actual);\n var resultCaptureOrdered = [];\n for (var index = 0; index < lastCaptureOrdered.length; index++) {\n var _argsForLast$getIsSti;\n var last = lastCaptureOrdered[index];\n var fresh = actualCaptureOrdered[index];\n\n // if a record is in the new index -> use that\n // it will have the latest data + dropEffect\n if (fresh != null) {\n resultCaptureOrdered.push(fresh);\n continue;\n }\n\n // At this point we have no drop target in the old spot\n // Check to see if we can use a previous sticky drop target\n\n // The \"parent\" is the one inside of `resultCaptureOrdered`\n // (the parent might be a drop target that was sticky)\n var parent = resultCaptureOrdered[index - 1];\n var lastParent = lastCaptureOrdered[index - 1];\n\n // Stickiness is based on parent relationships, so if the parent relationship has change\n // then we can stop our search\n if ((parent === null || parent === void 0 ? void 0 : parent.element) !== (lastParent === null || lastParent === void 0 ? void 0 : lastParent.element)) {\n break;\n }\n\n // We need to check whether the old drop target can still be dropped on\n\n var argsForLast = registry.get(last.element);\n\n // We cannot drop on a drop target that is no longer mounted\n if (!argsForLast) {\n break;\n }\n var feedback = {\n input: input,\n source: source,\n element: argsForLast.element\n };\n\n // We cannot drop on a drop target that no longer allows being dropped on\n if (argsForLast.canDrop && !argsForLast.canDrop(feedback)) {\n break;\n }\n\n // We cannot drop on a drop target that is no longer sticky\n if (!((_argsForLast$getIsSti = argsForLast.getIsSticky) !== null && _argsForLast$getIsSti !== void 0 && _argsForLast$getIsSti.call(argsForLast, feedback))) {\n break;\n }\n\n // Note: intentionally not recollecting `getData()` or `getDropEffect()`\n // Previous values for `data` and `dropEffect` will be borrowed\n // This is to prevent things like the 'closest edge' changing when\n // no longer over a drop target.\n // We could change our mind on this behaviour in the future\n\n resultCaptureOrdered.push(_objectSpread(_objectSpread({}, last), {}, {\n // making it clear to consumers this drop target is active due to stickiness\n isActiveDueToStickiness: true\n }));\n }\n\n // return bubble ordered result\n return copyReverse(resultCaptureOrdered);\n }\n return {\n dropTargetForConsumers: dropTargetForConsumers,\n getIsOver: getIsOver,\n dispatchEvent: dispatchEvent\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { once } from '../public-utils/once';\nexport function makeMonitor() {\n var registry = new Set();\n var dragging = null;\n function tryAddToActive(monitor) {\n if (!dragging) {\n return;\n }\n // Monitor is allowed to monitor events if:\n // 1. It has no `canMonitor` function (default is that a monitor can listen to everything)\n // 2. `canMonitor` returns true\n if (!monitor.canMonitor || monitor.canMonitor(dragging.canMonitorArgs)) {\n dragging.active.add(monitor);\n }\n }\n function monitorForConsumers(args) {\n // We are giving each `args` a new reference so that you\n // can create multiple monitors with the same `args`.\n var entry = _objectSpread({}, args);\n registry.add(entry);\n\n // if there is an active drag we need to see if this new monitor is relevant\n tryAddToActive(entry);\n function cleanup() {\n registry.delete(entry);\n\n // We need to stop publishing events during a drag to this monitor!\n if (dragging) {\n dragging.active.delete(entry);\n }\n }\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n }\n function dispatchEvent(_ref) {\n var eventName = _ref.eventName,\n payload = _ref.payload;\n if (eventName === 'onGenerateDragPreview') {\n dragging = {\n canMonitorArgs: {\n initial: payload.location.initial,\n source: payload.source\n },\n active: new Set()\n };\n var _iterator = _createForOfIteratorHelper(registry),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var monitor = _step.value;\n tryAddToActive(monitor);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n // This should never happen.\n if (!dragging) {\n return;\n }\n\n // Creating an array from the set _before_ iterating\n // This is so that monitors added during the current event will not be called.\n // This behaviour matches native EventTargets where an event listener\n // cannot add another event listener during an active event to the same\n // event target in the same event (for us we have a single global event target)\n var active = Array.from(dragging.active);\n for (var _i = 0, _active = active; _i < _active.length; _i++) {\n var _monitor = _active[_i];\n // A monitor can be removed by another monitor during an event.\n // We need to check that the monitor is still registered before calling it\n if (dragging.active.has(_monitor)) {\n var _monitor$eventName;\n // @ts-expect-error: I cannot get this type working!\n (_monitor$eventName = _monitor[eventName]) === null || _monitor$eventName === void 0 || _monitor$eventName.call(_monitor, payload);\n }\n }\n if (eventName === 'onDrop') {\n dragging.active.clear();\n dragging = null;\n }\n }\n return {\n dispatchEvent: dispatchEvent,\n monitorForConsumers: monitorForConsumers\n };\n}","import { lifecycle } from '../ledger/lifecycle-manager';\nimport { register } from '../ledger/usage-ledger';\nimport { makeDropTarget } from './make-drop-target';\nimport { makeMonitor } from './make-monitor';\nexport function makeAdapter(_ref) {\n var typeKey = _ref.typeKey,\n mount = _ref.mount,\n dispatchEventToSource = _ref.dispatchEventToSource,\n onPostDispatch = _ref.onPostDispatch,\n defaultDropEffect = _ref.defaultDropEffect;\n var monitorAPI = makeMonitor();\n var dropTargetAPI = makeDropTarget({\n typeKey: typeKey,\n defaultDropEffect: defaultDropEffect\n });\n function dispatchEvent(args) {\n // 1. forward the event to source\n dispatchEventToSource === null || dispatchEventToSource === void 0 || dispatchEventToSource(args);\n\n // 2. forward the event to relevant dropTargets\n dropTargetAPI.dispatchEvent(args);\n\n // 3. forward event to monitors\n monitorAPI.dispatchEvent(args);\n\n // 4. post consumer dispatch (used for honey pot fix)\n onPostDispatch === null || onPostDispatch === void 0 || onPostDispatch(args);\n }\n function start(_ref2) {\n var event = _ref2.event,\n dragType = _ref2.dragType;\n lifecycle.start({\n event: event,\n dragType: dragType,\n getDropTargetsOver: dropTargetAPI.getIsOver,\n dispatchEvent: dispatchEvent\n });\n }\n function registerUsage() {\n function mountAdapter() {\n var api = {\n canStart: lifecycle.canStart,\n start: start\n };\n return mount(api);\n }\n return register({\n typeKey: typeKey,\n mount: mountAdapter\n });\n }\n return {\n registerUsage: registerUsage,\n dropTarget: dropTargetAPI.dropTargetForConsumers,\n monitor: monitorAPI.monitorForConsumers\n };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\nexport var isAndroid = once(function isAndroid() {\n return navigator.userAgent.toLocaleLowerCase().includes('android');\n});\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var androidFallbackText = 'pdnd:android-fallback';","// Why we put the media types in their own files:\n//\n// - we are not putting them all in one file as not all adapters need all types\n// - we are not putting them in the external helpers as some things just need the\n// types and not the external functions code\nexport var textMediaType = 'text/plain';","// Why we put the media types in their own files:\n//\n// - we are not putting them all in one file as not all adapters need all types\n// - we are not putting them in the external helpers as some things just need the\n// types and not the external functions code\nexport var URLMediaType = 'text/uri-list';","/**\n * This key has been pulled into a separate module\n * so that the external adapter does not need to import\n * the element adapter\n */\nexport var elementAdapterNativeDataKey = 'application/vnd.pdnd';","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { bind } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { makeHoneyPotFix } from '../honey-pot-fix/make-honey-pot-fix';\nimport { makeAdapter } from '../make-adapter/make-adapter';\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nimport { androidFallbackText, isAndroid } from '../util/android';\nimport { getInput } from '../util/get-input';\nimport { textMediaType } from '../util/media-types/text-media-type';\nimport { URLMediaType } from '../util/media-types/url-media-type';\nimport { elementAdapterNativeDataKey } from './element-adapter-native-data-key';\n\n// Payload for the draggable being dragged\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-re-exports\n\nvar draggableRegistry = new WeakMap();\nfunction addToRegistry(args) {\n draggableRegistry.set(args.element, args);\n return function cleanup() {\n draggableRegistry.delete(args.element);\n };\n}\nvar honeyPotFix = makeHoneyPotFix();\nvar adapter = makeAdapter({\n typeKey: 'element',\n defaultDropEffect: 'move',\n mount: function mount(api) {\n /** Binding event listeners the `document` rather than `window` so that\n * this adapter always gets preference over the text adapter.\n * `document` is the first `EventTarget` under `window`\n * https://twitter.com/alexandereardon/status/1604658588311465985\n */\n return combine(honeyPotFix.bindEvents(), bind(document, {\n type: 'dragstart',\n listener: function listener(event) {\n var _entry$dragHandle, _entry$getInitialData, _entry$getInitialData2, _entry$dragHandle2, _entry$getInitialData3, _entry$getInitialData4;\n if (!api.canStart(event)) {\n return;\n }\n\n // If the \"dragstart\" event is cancelled, then a drag won't start\n // There will be no further drag operation events (eg no \"dragend\" event)\n if (event.defaultPrevented) {\n return;\n }\n\n // Technically `dataTransfer` can be `null` according to the types\n // But that behaviour does not seem to appear in the spec.\n // If there is not `dataTransfer`, we can assume something is wrong and not\n // start a drag\n if (!event.dataTransfer) {\n // Including this code on \"test\" and \"development\" environments:\n // - Browser tests commonly run against \"development\" builds\n // - Unit tests commonly run in \"test\"\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\"\\n It appears as though you have are not testing DragEvents correctly.\\n\\n - If you are unit testing, ensure you have polyfilled DragEvent.\\n - If you are browser testing, ensure you are dispatching drag events correctly.\\n\\n Please see our testing guides for more information:\\n https://atlassian.design/components/pragmatic-drag-and-drop/core-package/testing\\n \".replace(/ {2}/g, ''));\n }\n return;\n }\n\n // the closest parent that is a draggable element will be marked as\n // the `event.target` for the event\n var target = event.target;\n\n // this source is only for elements\n // Note: only HTMLElements can have the \"draggable\" attribute\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // see if the thing being dragged is owned by us\n var entry = draggableRegistry.get(target);\n\n // no matching element found\n // → dragging an element with `draggable=\"true\"` that is not controlled by us\n if (!entry) {\n return;\n }\n\n /**\n * A text selection drag _can_ have the `draggable` element be\n * the `event.target` if the user is dragging the text selection\n * from the `draggable`.\n *\n * To know if the `draggable` is being dragged, we look at whether any\n * `\"text/plain\"` data is being dragged. If it is, then a text selection\n * drag is occurring.\n *\n * This behaviour has been validated on:\n *\n * - Chrome@128 on Android@14\n * - Chrome@128 on iOS@17.6.1\n * - Chrome@128 on Windows@11\n * - Chrome@128 on MacOS@14.6.1\n * - Firefox@129 on Windows@11 (not possible for user to select text in a draggable)\n * - Firefox@129 on MacOS@14.6.1 (not possible for user to select text in a draggable)\n *\n * Note: Could usually just use: `event.dataTransfer.types.includes(textMediaType)`\n * but unfortunately ProseMirror is always setting `\"\"` as the dragged text\n *\n * Note: Unfortunately editor is (heavily) leaning on the current functionality today\n * and unwinding it will be a decent amount of effort. So for now, a text selection\n * where the `event.target` is a `draggable` element will still trigger the\n * element adapter.\n *\n * // Future state:\n * if(event.dataTransfer.getData(textMediaType)) {\n * \treturn;\n * }\n *\n */\n\n var input = getInput(event);\n var feedback = {\n element: entry.element,\n dragHandle: (_entry$dragHandle = entry.dragHandle) !== null && _entry$dragHandle !== void 0 ? _entry$dragHandle : null,\n input: input\n };\n\n // Check: does the draggable want to allow dragging?\n if (entry.canDrag && !entry.canDrag(feedback)) {\n // cancel drag operation if we cannot drag\n event.preventDefault();\n return;\n }\n\n // Check: is there a drag handle and is the user using it?\n if (entry.dragHandle) {\n // technically don't need this util, but just being\n // consistent with how we look up what is under the users\n // cursor.\n var over = getElementFromPointWithoutHoneypot({\n x: input.clientX,\n y: input.clientY\n });\n\n // if we are not dragging from the drag handle (or something inside the drag handle)\n // then we will cancel the active drag\n if (!entry.dragHandle.contains(over)) {\n event.preventDefault();\n return;\n }\n }\n\n /**\n * **Goal**\n * Pass information to other applications\n *\n * **Approach**\n * Put data into the native data store\n *\n * **What about the native adapter?**\n * When the element adapter puts native data into the native data store\n * the native adapter is not triggered in the current window,\n * but a native adapter in an external window _can_ be triggered\n *\n * **Why bake this into core?**\n * This functionality could be pulled out and exposed inside of\n * `onGenerateDragPreview`. But decided to make it a part of the\n * base API as it felt like a common enough use case and ended\n * up being a similar amount of code to include this function as\n * it was to expose the hook for it\n */\n var nativeData = (_entry$getInitialData = (_entry$getInitialData2 = entry.getInitialDataForExternal) === null || _entry$getInitialData2 === void 0 ? void 0 : _entry$getInitialData2.call(entry, feedback)) !== null && _entry$getInitialData !== void 0 ? _entry$getInitialData : null;\n if (nativeData) {\n for (var _i = 0, _Object$entries = Object.entries(nativeData); _i < _Object$entries.length; _i++) {\n var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),\n key = _Object$entries$_i[0],\n data = _Object$entries$_i[1];\n event.dataTransfer.setData(key, data !== null && data !== void 0 ? data : '');\n }\n }\n\n /**\n * 📱 For Android devices, a drag operation will not start unless\n * \"text/plain\" or \"text/uri-list\" data exists in the native data store\n * https://twitter.com/alexandereardon/status/1732189803754713424\n *\n * Tested on:\n * Device: Google Pixel 5\n * Android version: 14 (November 5, 2023)\n * Chrome version: 120.0\n */\n if (isAndroid() && !event.dataTransfer.types.includes(textMediaType) && !event.dataTransfer.types.includes(URLMediaType)) {\n event.dataTransfer.setData(textMediaType, androidFallbackText);\n }\n\n /**\n * 1. Must set any media type for `iOS15` to work\n * 2. We are also doing adding data so that the native adapter\n * can know that the element adapter has handled this drag\n *\n * We used to wrap this `setData()` in a `try/catch` for Firefox,\n * but it looks like that was not needed.\n *\n * Tested using: https://codesandbox.io/s/checking-firefox-throw-behaviour-on-dragstart-qt8h4f\n *\n * - ✅ Firefox@70.0 (Oct 2019) on macOS Sonoma\n * - ✅ Firefox@70.0 (Oct 2019) on macOS Big Sur\n * - ✅ Firefox@70.0 (Oct 2019) on Windows 10\n *\n * // just checking a few more combinations to be super safe\n *\n * - ✅ Chrome@78 (Oct 2019) on macOS Big Sur\n * - ✅ Chrome@78 (Oct 2019) on Windows 10\n * - ✅ Safari@14.1 on macOS Big Sur\n */\n event.dataTransfer.setData(elementAdapterNativeDataKey, '');\n var payload = {\n element: entry.element,\n dragHandle: (_entry$dragHandle2 = entry.dragHandle) !== null && _entry$dragHandle2 !== void 0 ? _entry$dragHandle2 : null,\n data: (_entry$getInitialData3 = (_entry$getInitialData4 = entry.getInitialData) === null || _entry$getInitialData4 === void 0 ? void 0 : _entry$getInitialData4.call(entry, feedback)) !== null && _entry$getInitialData3 !== void 0 ? _entry$getInitialData3 : {}\n };\n var dragType = {\n type: 'element',\n payload: payload,\n startedFrom: 'internal'\n };\n api.start({\n event: event,\n dragType: dragType\n });\n }\n }));\n },\n dispatchEventToSource: function dispatchEventToSource(_ref) {\n var _draggableRegistry$ge, _draggableRegistry$ge2;\n var eventName = _ref.eventName,\n payload = _ref.payload;\n // During a drag operation, a draggable can be:\n // - remounted with different functions\n // - removed completely\n // So we need to get the latest entry from the registry in order\n // to call the latest event functions\n\n (_draggableRegistry$ge = draggableRegistry.get(payload.source.element)) === null || _draggableRegistry$ge === void 0 || (_draggableRegistry$ge2 = _draggableRegistry$ge[eventName]) === null || _draggableRegistry$ge2 === void 0 || _draggableRegistry$ge2.call(_draggableRegistry$ge,\n // I cannot seem to get the types right here.\n // TS doesn't seem to like that one event can need `nativeSetDragImage`\n // @ts-expect-error\n payload);\n },\n onPostDispatch: honeyPotFix.getOnPostDispatch()\n});\nexport var dropTargetForElements = adapter.dropTarget;\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var monitorForElements = adapter.monitor;\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function draggable(args) {\n // Guardrail: warn if the drag handle is not contained in draggable element\n if (process.env.NODE_ENV !== 'production') {\n if (args.dragHandle && !args.element.contains(args.dragHandle)) {\n // eslint-disable-next-line no-console\n console.warn('Drag handle element must be contained in draggable element', {\n element: args.element,\n dragHandle: args.dragHandle\n });\n }\n }\n // Guardrail: warn if the draggable element is already registered\n if (process.env.NODE_ENV !== 'production') {\n var existing = draggableRegistry.get(args.element);\n if (existing) {\n // eslint-disable-next-line no-console\n console.warn('You have already registered a `draggable` on the same element', {\n existing: existing,\n proposed: args\n });\n }\n }\n var cleanup = combine(\n // making the draggable register the adapter rather than drop targets\n // this is because you *must* have a draggable element to start a drag\n // but you _might_ not have any drop targets immediately\n // (You might create drop targets async)\n adapter.registerUsage(), addToRegistry(args), addAttribute(args.element, {\n attribute: 'draggable',\n value: 'true'\n }));\n\n // Wrapping in `once` to prevent unexpected side effects if consumers call\n // the clean up function multiple times.\n return once(cleanup);\n}\n\n/** Common event payload for all events */\n\n/** A map containing payloads for all events */\n\n/** Common event payload for all drop target events */\n\n/** A map containing payloads for all events on drop targets */\n\n/** Arguments given to all feedback functions (eg `canDrag()`) on for a `draggable()` */\n\n/** Arguments given to all feedback functions (eg `canDrop()`) on a `dropTargetForElements()` */\n\n/** Arguments given to all monitor feedback functions (eg `canMonitor()`) for a `monitorForElements` */","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { monitorForElements } from '../../../adapter/element-adapter';\nimport { isSafari } from '../../../util/is-safari';\nimport { maxZIndex } from '../../../util/max-z-index';\nimport { popoverResetUserAgentStyles } from '../../../util/popover-reset-styles';\nimport { supportsPopover } from '../../../util/supports-popover';\n\n/** A function to remove the element that has been added to the `container`.\n * @example () => root.unmount()\n */\n\n/** A function that will render a preview element into a `container` `HTMLElement` */\n\n/** By default we use the build in values for the native drag preview: {x: 0, y: 0} */\nfunction defaultOffset() {\n return {\n x: 0,\n y: 0\n };\n}\n\n/** This function provides the ability to mount an element for it to be used as the native drag preview\n *\n * @example\n * draggable({\n * onGenerateDragPreview: ({ nativeSetDragImage }) => {\n * setCustomNativeDragPreview({\n * render: ({ container }) => {\n * const root = createRoot(container);\n * root.render(<Preview item={item} />);\n * return () => root.unmount();\n * },\n * nativeSetDragImage,\n * });\n * },\n * });\n */\nexport function setCustomNativeDragPreview(_ref) {\n var render = _ref.render,\n nativeSetDragImage = _ref.nativeSetDragImage,\n _ref$getOffset = _ref.getOffset,\n getOffset = _ref$getOffset === void 0 ? defaultOffset : _ref$getOffset;\n var container = document.createElement('div');\n\n // Using popover=\"manual\" to place the element in the browser's top layer.\n // This ensures the drag preview container is visually on top of everything else,\n // including elements using z-index and other stacking contexts.\n // \"manual\" means no light dismiss — we manage the lifecycle ourselves.\n // This element is only created for a single frame for the browser to take a\n // photo of it, and then it is destroyed.\n // Falls back to position:fixed + maxZIndex when the popover API is not available.\n // Note: the popover attribute must be set before the element is in the DOM.\n // `.showPopover()` is called further below after the element is appended to the body.\n if (supportsPopover()) {\n container.setAttribute('popover', 'manual');\n }\n Object.assign(container.style, _objectSpread(_objectSpread({\n // Ensuring we don't cause reflow when adding the element to the page\n // Using `position:fixed` rather than `position:absolute` so we are\n // positioned on the current viewport.\n // `position:fixed` also creates a new stacking context, so we don't need to do that here\n position: 'fixed'\n }, supportsPopover() ?\n // needs to come first as it has 'inset: unset' which\n // needs to be overridden by our top / left values\n popoverResetUserAgentStyles : {\n // Fallback: using maximum possible z-index so that this element\n // will always be on top of other positioned content.\n zIndex: maxZIndex\n }), {}, {\n // According to `mdn`, the element can be offscreen:\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage#imgelement\n //\n // However, that information does not appear in the specs:\n // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-setdragimage-dev\n //\n // If the element is _completely_ offscreen, Safari@17.1 will cancel the drag\n top: 0,\n left: 0,\n // Avoiding any additional events caused by the new element (being super safe)\n pointerEvents: 'none'\n }));\n document.body.append(container);\n\n // `.showPopover()` must be called after the element is in the DOM.\n if (supportsPopover()) {\n container.showPopover();\n }\n var unmount = render({\n container: container\n });\n\n /**\n * Some frameworks (eg `react`) don't render into the container until the next microtask.\n * - This will run before the browser takes it's picture of the element\n * - This will run before the animation frame that removes `container`.\n * */\n\n queueMicrotask(function () {\n var previewOffset = getOffset({\n container: container\n });\n\n /**\n * **Problem**\n * On `Safari@17.1` if a drag preview element has some opacity,\n * Safari will include elements behind the drag preview element\n * in the drag preview.\n * Bug: https://bugs.webkit.org/show_bug.cgi?id=266025\n *\n * **Fix**\n * We push the drag preview so it is _almost_ completely offscreen so that\n * there won't be any elements behind the drag preview element.\n * If the element is _completely_ offscreen, then the drag is cancelled by Safari.\n *\n * Using `-0.0001` so that any potential \"see through\" on the drag preview element\n * is effectively invisible 👻\n *\n * **Unsuccessful alternatives**\n * Setting a background color (eg \"white\") on the `container`\n * → Wrecks the opacity of the drag preview element\n *\n * Adding a parent element of the `container` with a background color (eg \"white\")\n * → Wrecks the opacity of the drag preview element\n */\n /**\n * Update: this bug fix is no longer needed in `Safari@26.4` (and maybe earlier)\n * We can remove it in a future release\n */\n if (isSafari()) {\n var rect = container.getBoundingClientRect();\n\n // We cannot apply this fix if nothing has been rendered into the `container`\n if (rect.width === 0) {\n return;\n }\n container.style.left = \"-\".concat(rect.width - 0.0001, \"px\");\n }\n nativeSetDragImage === null || nativeSetDragImage === void 0 || nativeSetDragImage(container, previewOffset.x, previewOffset.y);\n });\n function cleanup() {\n // No need to call `.hidePopover()`.\n // Removing the element from the DOM dismisses the popover\n unbindMonitor();\n unmount === null || unmount === void 0 || unmount();\n document.body.removeChild(container);\n }\n var unbindMonitor = monitorForElements({\n // Remove portal in the dragstart event so that the user will never see it\n onDragStart: cleanup,\n // Backup: remove portal when the drop finishes (this would be an error case)\n onDrop: cleanup\n });\n}","export function preserveOffsetOnSource(_ref) {\n var element = _ref.element,\n input = _ref.input;\n return function getOffset(_ref2) {\n var container = _ref2.container;\n /**\n * **Android**\n *\n * This function won't do anything 😅.\n * The drag preview will _always_ be under the center of the users pointer.\n * There is no harm in calling this function though 🧘.\n *\n * **iOS and iPadOS**\n *\n * The drag preview is lifted in the expected position and then slides under\n * the users pointer.\n * This is more pleasing than immediately putting the center of the drag preview\n * under the users pointer.\n * With this function the drag preview looks like it is popping out\n * of the UI and then it shifts under the users pointer as the drag is occurring ✨\n */\n\n var sourceRect = element.getBoundingClientRect();\n var containerRect = container.getBoundingClientRect();\n var offsetX = Math.min(\n // difference\n input.clientX - sourceRect.x,\n // don't let the difference be more than the width of the container,\n // otherwise the pointer will be off the preview\n containerRect.width);\n var offsetY = Math.min(\n // difference\n input.clientY - sourceRect.y,\n // don't let the difference be more than the height of the container,\n // otherwise the pointer will be off the preview\n containerRect.height);\n return {\n x: offsetX,\n y: offsetY\n };\n };\n}","/**\n * Arrastre de eventos en timeGrid sobre pragmatic-drag-and-drop.\n *\n * Sustituye al controlador por puntero SOLO para MOVER. El redimensionado por\n * los bordes sigue en `startEventDrag`: pdnd resuelve drag-and-drop, no resize.\n *\n * Lo que aporta frente al anterior: cada columna es un drop target, asi que\n * mover una cita a OTRO DIA en semana y semana laboral sale del propio modelo\n * en vez de tener que resolverlo a mano. El delta de minutos se sigue\n * calculando con la geometria del nucleo, a partir de la posicion del puntero\n * dentro de la columna destino.\n *\n * pdnd se apoya en el drag and drop NATIVO de HTML5, de ahi que la vista previa\n * se configure con `setCustomNativeDragPreview` y no moviendo el elemento.\n */\nimport {\n draggable,\n dropTargetForElements,\n monitorForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter\";\nimport { setCustomNativeDragPreview } from \"@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview\";\nimport { preserveOffsetOnSource } from \"@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source\";\nimport { dl, timeStringToMinutes, type CalendarApi, type EventDef } from \"@reservi/core\";\n\nimport type { RsvDate, TimeGridModel } from \"@reservi/core\";\n\n/**\n * Instante del ultimo arrastre. Tras soltar, el navegador dispara ademas un\n * `click`: sin este guard ese click abre el detalle de la cita (si cae sobre el\n * evento) y crea un borrador (si cae sobre la columna), justo despues de\n * haberla movido. No hay forma fiable de distinguir ese click sintetico del de\n * un usuario, asi que se ignoran los que llegan pegados a un arrastre.\n */\nlet instanteUltimoArrastre = 0;\n\n/** Anota que se acaba de arrastrar. */\nexport function marcarArrastre(): void {\n instanteUltimoArrastre = Date.now();\n}\n\n/** ¿Acaba de terminar un arrastre? Los clicks de esa ventana se descartan. */\nexport function arrastreReciente(ventanaMs = 300): boolean {\n return Date.now() - instanteUltimoArrastre < ventanaMs;\n}\n\n/** Marca los datos que viajan en el arrastre, para no confundir origenes. */\nconst TIPO_EVENTO = \"rsv-timegrid-event\";\nconst TIPO_COLUMNA = \"rsv-timegrid-col\";\n\nexport interface RangoPreview {\n dayIndex: number;\n startMin: number;\n endMin: number;\n}\n\n/** Hace arrastrable la tarjeta de un evento. Devuelve la limpieza. */\nexport function hacerEventoArrastrable(\n el: HTMLElement,\n event: EventDef,\n editable: boolean,\n): () => void {\n if (!editable) return () => {};\n return draggable({\n element: el,\n getInitialData: () => ({ [TIPO_EVENTO]: true, id: event.id }),\n onGenerateDragPreview({ location, nativeSetDragImage }) {\n // La vista previa nativa conserva el punto exacto donde se agarro la\n // tarjeta; sin esto el navegador la centra bajo el cursor y el gesto se\n // siente descolocado en franjas altas.\n setCustomNativeDragPreview({\n nativeSetDragImage,\n getOffset: preserveOffsetOnSource({ element: el, input: location.current.input }),\n render({ container }) {\n const copia = el.cloneNode(true) as HTMLElement;\n copia.setAttribute(\"data-rsv-drag-preview\", \"true\");\n copia.style.width = `${el.offsetWidth}px`;\n copia.style.height = `${el.offsetHeight}px`;\n container.appendChild(copia);\n },\n });\n },\n });\n}\n\n/**\n * Registra una columna como destino de sueltas. Devuelve la limpieza.\n *\n * Solo viaja el INDICE de la columna, leido del DOM al soltar. Ni se captura en\n * el registro (Preact reutiliza el elemento al navegar de semana, y el valor se\n * quedaria apuntando a la anterior) ni se manda la fecha como texto: quien\n * necesite el dia lo toma del modelo por este indice, porque una ida y vuelta\n * por `dl.toISOString`/`dl.from` devuelve la hora actual.\n */\nexport function hacerColumnaDestino(el: HTMLElement): () => void {\n return dropTargetForElements({\n element: el,\n canDrop: ({ source }) => source.data[TIPO_EVENTO] === true,\n getData: ({ element }) => ({\n [TIPO_COLUMNA]: true,\n dayIndex: Number((element as HTMLElement).dataset.rsvDayIndex ?? 0),\n }),\n });\n}\n\ninterface OpcionesMonitor {\n api: CalendarApi;\n /**\n * Getter, no valor: el modelo cambia al navegar de semana y un modelo\n * capturado en el registro dejaria de corresponder con lo que se ve.\n */\n getModel: () => TimeGridModel;\n snap?: string | undefined;\n /** Rango destino en curso; `null` al terminar. */\n onPreview: (rango: RangoPreview | null) => void;\n /** Id del evento que se esta arrastrando; `null` al terminar. */\n onDragging: (id: string | null) => void;\n}\n\n/** Minutos del dia bajo el puntero dentro de una columna. Exportada para test. */\nexport function minutosEnColumna(\n columnaEl: HTMLElement,\n clientY: number,\n model: TimeGridModel,\n snapMin: number,\n): number {\n const rect = columnaEl.getBoundingClientRect();\n const total = model.maxMinutes - model.minMinutes;\n if (rect.height === 0 || total <= 0) return model.minMinutes;\n const crudo = model.minMinutes + ((clientY - rect.top) / rect.height) * total;\n const acotado = Math.max(model.minMinutes, Math.min(model.maxMinutes, crudo));\n return Math.round(acotado / snapMin) * snapMin;\n}\n\n/**\n * Minutos de `desde` a `hasta`, positivos si `hasta` es posterior.\n *\n * `dl.diff(a, b)` devuelve `b - a`, al reves de lo que sugiere el orden de los\n * argumentos. Usarlo directamente movia los eventos en direccion contraria, asi\n * que se encapsula aqui una sola vez en lugar de recordar la convencion en cada\n * llamada.\n */\nfunction duracionMin(desde: RsvDate, hasta: RsvDate): number {\n return dl.diff(desde, hasta, \"minute\");\n}\n\n/**\n * Nuevo rango del evento al soltarlo en `dia` a `minutosEnDia` del dia.\n *\n * Devuelve `null` si no hay cambio real. La duracion se conserva: el fin se\n * desplaza lo mismo que el inicio.\n */\nexport function calcularDestino(\n dia: RsvDate,\n minutosEnDia: number,\n event: { start: RsvDate; end: RsvDate | null },\n): { start: RsvDate; end: RsvDate | null } | null {\n const nuevoInicio = dl.add(dl.startOf(dia, \"day\"), { minutes: minutosEnDia });\n // Sin cambio: nada que aplicar.\n if (duracionMin(nuevoInicio, event.start) === 0) return null;\n const duracion = event.end ? duracionMin(event.start, event.end) : 0;\n return {\n start: nuevoInicio,\n end: event.end ? dl.add(nuevoInicio, { minutes: duracion }) : null,\n };\n}\n\n/**\n * Escucha los arrastres de eventos de timeGrid y aplica el movimiento al\n * soltar. Devuelve la limpieza.\n */\nexport function monitorizarArrastres({\n api,\n getModel,\n snap,\n onPreview,\n onDragging,\n}: OpcionesMonitor): () => void {\n const snapMin = timeStringToMinutes(snap ?? \"00:15\") || 15;\n\n /** Destino bajo el puntero, o null si no hay columna valida. */\n const destino = (location: {\n current: {\n input: { clientY: number };\n dropTargets: readonly { element: Element; data: Record<string, unknown> }[];\n };\n }) => {\n const target = location.current.dropTargets.find((t) => t.data[TIPO_COLUMNA] === true);\n if (!target) return null;\n const inicio = minutosEnColumna(\n target.element as HTMLElement,\n location.current.input.clientY,\n getModel(),\n snapMin,\n );\n return { target, inicio };\n };\n\n return monitorForElements({\n canMonitor: ({ source }) => source.data[TIPO_EVENTO] === true,\n onDragStart: ({ source }) => {\n marcarArrastre();\n onDragging(String(source.data.id));\n },\n onDrag: ({ source, location }) => {\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n const duracion = event.end ? Math.max(snapMin, duracionMin(event.start, event.end)) : snapMin;\n onPreview({\n dayIndex: Number(d.target.data.dayIndex),\n startMin: d.inicio,\n endMin: d.inicio + duracion,\n });\n },\n onDrop: ({ source, location }) => {\n marcarArrastre();\n onPreview(null);\n onDragging(null);\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n\n // El destino se compone de dos partes: el dia lo da la columna, la hora\n // la posicion del puntero dentro de ella.\n //\n // El dia se toma del MODELO por su indice, no parseando `data-date`:\n // `dl.toISOString` produce una fecha terminada en `Z` y `dl.from` devuelve\n // la HORA ACTUAL ante ese formato, asi que la ida y vuelta por texto\n // resolvia siempre a hoy y el movimiento entre dias no se aplicaba.\n const dia = getModel().days[Number(d.target.data.dayIndex)]?.date;\n if (!dia) return;\n const siguiente = calcularDestino(dia, d.inicio, event);\n if (!siguiente) return;\n\n if (api.moveEvent(event.id, siguiente.start, siguiente.end)) {\n const actualizado = api.getEventById(event.id);\n if (actualizado) api.trigger(\"eventDrop\", { event: actualizado });\n }\n },\n });\n}\n","/**\n * Arrastre de eventos entre dias en dayGrid/mes, sobre pragmatic-drag-and-drop.\n *\n * Hermano de `pdnd-timegrid`, con dos diferencias propias del mes: el destino es\n * una CELDA DE DIA (no una columna con hora), y el movimiento conserva la hora\n * del evento — solo cambia la fecha.\n *\n * Comparte con el timeGrid el `draggable` de la tarjeta, para que la elevacion y\n * la vista previa nativa se vean igual en las dos vistas.\n */\nimport {\n dropTargetForElements,\n monitorForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter\";\nimport { dl, type CalendarApi, type RsvDate } from \"@reservi/core\";\n\nimport { marcarArrastre } from \"./pdnd-timegrid.js\";\n\nconst TIPO_EVENTO = \"rsv-timegrid-event\";\nconst TIPO_DIA = \"rsv-daygrid-day\";\n\n/**\n * Nuevo rango al soltar el evento en `dia`, conservando su hora.\n *\n * Devuelve `null` si cae en el mismo dia. Se desplaza por dias completos, asi\n * que la hora y la duracion quedan intactas.\n */\nexport function calcularDestinoDia(\n dia: RsvDate,\n event: { start: RsvDate; end: RsvDate | null },\n): { start: RsvDate; end: RsvDate | null } | null {\n // `dl.diff(a, b)` devuelve `b - a`: el orden importa y ya nos costo un bug.\n const dias = dl.diff(dl.startOf(event.start, \"day\"), dl.startOf(dia, \"day\"), \"day\");\n if (dias === 0) return null;\n return {\n start: dl.add(event.start, { days: dias }),\n end: event.end ? dl.add(event.end, { days: dias }) : null,\n };\n}\n\n/** Registra una celda de dia como destino. Devuelve la limpieza. */\nexport function hacerDiaDestino(el: HTMLElement): () => void {\n return dropTargetForElements({\n element: el,\n canDrop: ({ source }) => source.data[TIPO_EVENTO] === true,\n // Sin capturas: la fecha se lee del DOM al soltar, porque Preact reutiliza\n // la celda al navegar de mes.\n getData: ({ element }) => ({\n [TIPO_DIA]: true,\n fechaISO: (element as HTMLElement).dataset.date ?? \"\",\n }),\n });\n}\n\ninterface OpcionesMonitor {\n api: CalendarApi;\n /** Dia destino en curso (ISO), o `null` al terminar. */\n onPreview: (fechaISO: string | null) => void;\n onDragging: (id: string | null) => void;\n}\n\n/** Escucha los arrastres del mes y aplica el cambio de dia. Devuelve la limpieza. */\nexport function monitorizarArrastresDia({\n api,\n onPreview,\n onDragging,\n}: OpcionesMonitor): () => void {\n const destino = (location: {\n current: { dropTargets: readonly { data: Record<string, unknown> }[] };\n }) => location.current.dropTargets.find((t) => t.data[TIPO_DIA] === true) ?? null;\n\n return monitorForElements({\n canMonitor: ({ source }) => source.data[TIPO_EVENTO] === true,\n onDragStart: ({ source }) => {\n marcarArrastre();\n onDragging(String(source.data.id));\n },\n onDrag: ({ location }) => {\n const d = destino(location);\n onPreview(d ? String(d.data.fechaISO) : null);\n },\n onDrop: ({ source, location }) => {\n marcarArrastre();\n onPreview(null);\n onDragging(null);\n const d = destino(location);\n if (!d) return;\n const event = api.getEventById(String(source.data.id));\n if (!event) return;\n\n const siguiente = calcularDestinoDia(dl.from(String(d.data.fechaISO)), event);\n if (!siguiente) return;\n if (api.moveEvent(event.id, siguiente.start, siguiente.end)) {\n const actualizado = api.getEventById(event.id);\n if (actualizado) api.trigger(\"eventDrop\", { event: actualizado });\n }\n },\n });\n}\n","import {\n dl,\n getLocaleText,\n type CalendarApi,\n type DayGridCell,\n type DayGridModel,\n type EventDef,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport { dateFormatter, timeFormatter } from \"../../render/format.js\";\nimport { navLinkToDay } from \"../../render/nav.js\";\nimport { handleEventKeydown } from \"../../interaction/keyboard.js\";\nimport { startDayRangeSelect } from \"../../interaction/daygrid-drag.js\";\nimport { hacerEventoArrastrable } from \"../../interaction/pdnd-timegrid.js\";\nimport { hacerDiaDestino, monitorizarArrastresDia } from \"../../interaction/pdnd-daygrid.js\";\n\ninterface DayGridViewProps {\n api: CalendarApi;\n model: DayGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de cuadrícula por días (mes/semana/día/año). */\nexport function DayGridView({ api, model, options }: DayGridViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const dowFmt = dateFormatter(locale, options.dayHeaderFormat, { weekday: \"short\" });\n const headerDays = model.weeks[0]?.days ?? [];\n const showWeekNums = options.weekNumbers === true;\n const showDayHeaders = options.dayHeaders !== false;\n // El defecto es \"end\" porque es lo que el tema ya hacia con `align-self: flex-end`: la opcion\n // no debe mover numeros a quien no la use.\n const dayNumberAlign = options.dayNumberAlign ?? \"end\";\n\n const [diaDestino, setDiaDestino] = useState<string | null>(null);\n const [idArrastrado, setIdArrastrado] = useState<string | null>(null);\n const limpiezaDias = useRef(new Map<HTMLElement, () => void>());\n\n // Un unico monitor para toda la vista, igual que en timeGrid.\n useEffect(\n () => monitorizarArrastresDia({ api, onPreview: setDiaDestino, onDragging: setIdArrastrado }),\n [api],\n );\n useEffect(() => {\n const mapa = limpiezaDias.current;\n return () => {\n for (const limpiar of mapa.values()) limpiar();\n mapa.clear();\n };\n }, []);\n\n return (\n <div\n data-rsv=\"daygrid\"\n data-weeknumbers={String(showWeekNums)}\n data-daynumber-align={dayNumberAlign}\n style={`--rsv-cols:${model.columnCount}`}\n >\n {showDayHeaders && (\n <div data-rsv=\"daygrid-header\" role=\"row\">\n {showWeekNums && <div data-rsv=\"daygrid-weeknum-header\" role=\"columnheader\" />}\n {headerDays.map((cell) => {\n const date = dl.toDate(cell.date);\n const text = dowFmt ? dowFmt(date) : \"\";\n const headerArg = {\n date,\n text,\n dayOfWeek: cell.dayOfWeek,\n dayNumber: dl.dayOfMonth(cell.date),\n isToday: cell.isToday,\n view,\n };\n return (\n <div\n data-rsv=\"daygrid-dow\"\n role=\"columnheader\"\n data-dow={String(cell.dayOfWeek)}\n class={cx(options.classNames?.dayHeader)}\n key={cell.dayOfWeek}\n ref={(el) => callDidMount(el, options.hooks?.dayHeaderDidMount, () => headerArg)}\n >\n {renderSlot(options.slots?.dayHeaderContent, headerArg, text, options.hostBridge)}\n </div>\n );\n })}\n </div>\n )}\n\n {model.weeks.map((week, wi) => (\n <div data-rsv=\"daygrid-week\" role=\"row\" key={wi}>\n {showWeekNums && (\n <div data-rsv=\"daygrid-weeknum\" role=\"rowheader\">\n {week.weekNumber}\n </div>\n )}\n {week.days.map((cell) => (\n <DayCell\n api={api}\n cell={cell}\n options={options}\n view={view}\n key={dl.toISOString(cell.date)}\n dropActivo={diaDestino === dl.toISOString(cell.date)}\n limpiezaDias={limpiezaDias}\n idArrastrado={idArrastrado}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction DayCell({\n api,\n cell,\n options,\n view,\n dropActivo,\n limpiezaDias,\n idArrastrado,\n}: {\n api: CalendarApi;\n cell: DayGridCell;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** Este dia es el destino bajo el puntero durante un arrastre. */\n dropActivo: boolean;\n /** Registro de limpiezas de los drop targets, compartido por la vista. */\n limpiezaDias: { current: Map<HTMLElement, () => void> };\n /** Evento que se esta arrastrando, para elevarlo con CSS. */\n idArrastrado: string | null;\n}): VNode {\n const date = dl.toDate(cell.date);\n const dayNumber = dl.dayOfMonth(cell.date);\n const defaultNumber = options.navLinks ? (\n <a\n data-rsv=\"day-number\"\n data-nav-link=\"true\"\n role=\"link\"\n tabIndex={0}\n title={getLocaleText(options.locale).navLinkHint(\n new Intl.DateTimeFormat(options.locale, { dateStyle: \"long\" }).format(date),\n )}\n onClick={(e) => {\n e.stopPropagation();\n navLinkToDay(api, cell.date);\n }}\n >\n {dayNumber}\n </a>\n ) : (\n <span data-rsv=\"day-number\">{dayNumber}</span>\n );\n const cellArg = { date, dayNumber, isToday: cell.isToday, isOther: cell.isOther, view };\n const numberNode = renderSlot(\n options.slots?.dayCellContent,\n cellArg,\n defaultNumber,\n options.hostBridge,\n );\n\n const [moreOpen, setMoreOpen] = useState(false);\n\n const dateStr = dl.toISOString(cell.date);\n const rangeSelectedRef = useRef(false);\n\n const onDayClick = () => {\n // Suprime el click que sigue a una selección por arrastre.\n if (rangeSelectedRef.current) {\n rangeSelectedRef.current = false;\n return;\n }\n // `cell.isBusiness` ya viene del modelo; no hace falta resolver el horario aquí.\n if (options.selectConstraint === \"businessHours\" && !cell.isBusiness) return;\n api.trigger(\"dateClick\", { date: cell.date });\n if (options.selectable) {\n api.select(dateStr, dl.toISOString(dl.add(cell.date, { days: 1 })));\n }\n };\n\n const openMore = (e: Event) => {\n e.stopPropagation();\n // El aviso se dispara siempre, tambien con el popover desactivado: si el host se queda sin\n // popover y sin evento, el boton no hace nada y no tiene con que pintar el suyo.\n if (options.moreLinkPopover !== false) setMoreOpen(true);\n api.trigger(\"moreLinkClick\", {\n date: cell.date,\n allEvents: [...cell.events, ...cell.hiddenEvents],\n hiddenEvents: cell.hiddenEvents,\n });\n };\n\n return (\n <div\n data-rsv=\"day\"\n role=\"gridcell\"\n data-date={dateStr}\n data-rsv-drop={dropActivo ? \"true\" : undefined}\n data-today={String(cell.isToday)}\n data-other={String(cell.isOther)}\n data-weekend={String(cell.isWeekend)}\n data-business={String(cell.isBusiness)}\n data-selected={String(cell.isSelected)}\n class={cx(options.classNames?.day)}\n ref={(el) => {\n callDidMount(el, options.hooks?.dayCellDidMount, () => cellArg);\n // Preact llama a los refs en CADA render: sin la guarda se acumularian\n // registros de drop target sobre el mismo elemento.\n if (!el || limpiezaDias.current.has(el)) return;\n limpiezaDias.current.set(el, hacerDiaDestino(el));\n }}\n onClick={onDayClick}\n onPointerDown={\n options.selectable\n ? (e) =>\n startDayRangeSelect(e, {\n api,\n startDate: dateStr,\n onRangeSelect: () => {\n rangeSelectedRef.current = true;\n },\n })\n : undefined\n }\n >\n {numberNode}\n {cell.events\n .filter((event) => event.display !== \"none\")\n .map((event) => (\n <EventChip\n api={api}\n event={event}\n options={options}\n view={view}\n arrastrandose={idArrastrado === event.id}\n key={event.id}\n />\n ))}\n {cell.moreCount > 0 && (\n <div data-rsv=\"more-anchor\">\n <button type=\"button\" data-rsv=\"more-link\" onClick={openMore}>\n {renderSlot(\n options.slots?.moreLinkContent,\n {\n date,\n moreCount: cell.moreCount,\n allEvents: [...cell.events, ...cell.hiddenEvents],\n hiddenEvents: cell.hiddenEvents,\n view,\n },\n getLocaleText(options.locale).more(cell.moreCount),\n options.hostBridge,\n )}\n </button>\n {moreOpen && (\n <DayMorePopover\n api={api}\n cell={cell}\n options={options}\n view={view}\n onClose={() => setMoreOpen(false)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Popover de \"+N more\": lista todos los eventos del día (visibles + ocultos). */\nfunction DayMorePopover({\n api,\n cell,\n options,\n view,\n onClose,\n}: {\n api: CalendarApi;\n cell: DayGridCell;\n options: ReserviCalendarOptions;\n view: ViewArg;\n onClose: () => void;\n}): VNode {\n const ref = useRef<HTMLDivElement>(null);\n const dayFmt = new Intl.DateTimeFormat(options.locale ?? \"en\", {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n const allEvents = [...cell.events, ...cell.hiddenEvents].filter((e) => e.display !== \"none\");\n\n useEffect(() => {\n const onPointer = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointer);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [onClose]);\n\n return (\n <div data-rsv=\"more-popover\" role=\"dialog\" ref={ref} onClick={(e) => e.stopPropagation()}>\n <div data-rsv=\"more-popover-header\">\n <span data-rsv=\"more-popover-title\">{dayFmt.format(dl.toDate(cell.date))}</span>\n <button type=\"button\" data-rsv=\"more-popover-close\" aria-label=\"✕\" onClick={onClose}>\n ✕\n </button>\n </div>\n <div data-rsv=\"more-popover-body\">\n {allEvents.map((event) => (\n <EventChip\n api={api}\n event={event}\n options={options}\n view={view}\n arrastrandose={false}\n key={event.id}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction EventChip({\n api,\n event,\n options,\n view,\n arrastrandose,\n}: {\n api: CalendarApi;\n event: EventDef;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** Se esta arrastrando ahora mismo, para elevarlo con CSS. */\n arrastrandose: boolean;\n}): VNode {\n const editable = options.editable === true && event.editable !== false;\n /** Mover entre dias es un permiso aparte del de redimensionar. */\n // Nota: `EventInput.startEditable` existe en el tipo publico pero\n // `normalizeEvent` no lo traslada a `EventDef`, asi que por ahora el permiso\n // por evento no se puede afinar; solo el global.\n const arrastrable = editable && options.eventDraggable === true;\n const limpiarArrastre = useRef<(() => void) | null>(null);\n const nodoArrastre = useRef<HTMLElement | null>(null);\n useEffect(() => () => limpiarArrastre.current?.(), []);\n const selected = api.selectedEventIds.value.has(event.id);\n const draggedRef = useRef(false);\n const eventFmt = timeFormatter(options.locale ?? \"en\", options.eventTimeFormat);\n const timeText = event.allDay\n ? \"\"\n : eventFmt\n ? eventFmt(dl.toDate(event.start))\n : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: event.allDay, timeText, view };\n const content = renderSlot(\n options.slots?.eventContent,\n contentArg,\n <span data-rsv=\"event-title\">\n {timeText ? `${timeText} ` : \"\"}\n {event.title}\n </span>,\n options.hostBridge,\n );\n\n return (\n <div\n data-rsv=\"event\"\n role=\"button\"\n tabIndex={0}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-all-day={String(event.allDay)}\n data-display={event.display}\n data-event-id={event.id}\n data-editable={String(editable)}\n data-rsv-selected={String(selected)}\n data-rsv-dragging={arrastrandose ? \"true\" : undefined}\n ref={(el) => {\n callDidMount(el, options.hooks?.eventDidMount, () => contentArg);\n // Solo si cambia el NODO: Preact llama a los refs en cada render y\n // recrear el `draggable` a mitad del gesto lo cancelaria.\n if (el === nodoArrastre.current) return;\n limpiarArrastre.current?.();\n nodoArrastre.current = el;\n limpiarArrastre.current = el ? hacerEventoArrastrable(el, event, arrastrable) : null;\n }}\n style={\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n // Suprime el click que sigue a un arrastre.\n if (draggedRef.current) {\n draggedRef.current = false;\n return;\n }\n // Ctrl/Cmd-click: alterna selección múltiple (bulk ops) en vez de eventClick.\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n onKeyDown={\n editable\n ? (e) =>\n handleEventKeydown(e, {\n api,\n event,\n kind: \"dayGrid\",\n shortcuts: options.keyboardShortcuts,\n })\n : undefined\n }\n >\n {content}\n </div>\n );\n}\n","/**\n * Auto-scroll de un contenedor scrolleable mientras el puntero está cerca de\n * su borde superior/inferior durante un drag. `update()` se llama en cada\n * `pointermove`; el propio scroll corre por rAF mientras el drag sigue activo.\n */\nconst EDGE_PX = 40;\nconst MAX_SPEED_PX = 16;\n\nexport interface AutoScroller {\n /** Llamar en cada pointermove con la posición Y actual del puntero. */\n update(clientY: number): void;\n /** Total de px que el auto-scroll desplazó el contenedor (sumar al delta del drag). */\n getScrolled(): number;\n /** Detener el loop (llamar en pointerup/pointercancel). */\n stop(): void;\n}\n\nconst NOOP_SCROLLER: AutoScroller = {\n update() {},\n getScrolled: () => 0,\n stop() {},\n};\n\nexport function startAutoScroll(container: HTMLElement | null): AutoScroller {\n if (!container) return NOOP_SCROLLER;\n\n let lastY = 0;\n let scrolled = 0;\n let raf = 0;\n\n const tick = (): void => {\n const rect = container.getBoundingClientRect();\n let delta = 0;\n if (lastY < rect.top + EDGE_PX) {\n delta = -MAX_SPEED_PX * (1 - Math.max(0, lastY - rect.top) / EDGE_PX);\n } else if (lastY > rect.bottom - EDGE_PX) {\n delta = MAX_SPEED_PX * (1 - Math.max(0, rect.bottom - lastY) / EDGE_PX);\n }\n if (delta !== 0) {\n const before = container.scrollTop;\n container.scrollTop += delta;\n scrolled += container.scrollTop - before; // ya clampeado a los límites de scroll\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n update(clientY) {\n lastY = clientY;\n },\n getScrolled: () => scrolled,\n stop() {\n cancelAnimationFrame(raf);\n },\n };\n}\n","/**\n * Controlador de drag/resize por puntero para timeGrid. Usa la geometría pura\n * del núcleo (testeada en @reservi/core) y mide la columna del DOM para obtener\n * px/min. El cálculo de fechas NO vive aquí (vive en core/interaction).\n */\nimport {\n computeDrop,\n computeResize,\n dl,\n pxToSnappedMinutes,\n timeStringToMinutes,\n type CalendarApi,\n type EventDef,\n type ResizeEdge,\n type RsvDate,\n type TimeGridModel,\n} from \"@reservi/core\";\nimport { startAutoScroll } from \"./auto-scroll.js\";\n\n/** Contenedor scrolleable de timeGrid (ver `[data-rsv=\"tg-body\"]` en TimeGridView). */\nfunction scrollAncestor(el: HTMLElement): HTMLElement | null {\n return el.closest<HTMLElement>('[data-rsv=\"tg-body\"]');\n}\n\ninterface DragOptions {\n api: CalendarApi;\n event: EventDef;\n model: TimeGridModel;\n columnEl: HTMLElement;\n snap?: string | undefined;\n /** Si se indica, redimensiona por ese borde; si no, mueve el evento. */\n edge?: ResizeEdge | undefined;\n /**\n * Se llama en cada movimiento con el rango destino (minutos absolutos del\n * dia), y con `null` al soltar. Sirve para pintar el fantasma que indica\n * donde va a caer el evento; sin esto la tarjeta se queda quieta y salta a su\n * nueva posicion solo al soltar.\n */\n onPreview?: ((range: RangePreview | null) => void) | undefined;\n}\n\nexport function startEventDrag(ev: PointerEvent, options: DragOptions): void {\n ev.preventDefault();\n ev.stopPropagation();\n const { api, event, model, columnEl, snap = \"00:15\", edge, onPreview } = options;\n\n const rect = columnEl.getBoundingClientRect();\n const totalMinutes = model.maxMinutes - model.minMinutes;\n const ppm = rect.height === 0 ? 0 : rect.height / totalMinutes;\n const startY = ev.clientY;\n\n // Auto-scroll del cuerpo de timeGrid al arrastrar cerca de su borde superior/inferior.\n const scroller = startAutoScroll(scrollAncestor(columnEl));\n scroller.update(ev.clientY);\n\n const snapMinArrastre = timeStringToMinutes(snap) || 15;\n\n /** Minutos absolutos del dia de un instante, para situar el fantasma. */\n const aMinutos = (d: Parameters<typeof dl.toDate>[0]): number => {\n const fecha = dl.toDate(d);\n return fecha.getHours() * 60 + fecha.getMinutes();\n };\n\n const onMove = (e: PointerEvent): void => {\n scroller.update(e.clientY);\n if (!onPreview) return;\n const delta = pxToSnappedMinutes(e.clientY - startY + scroller.getScrolled(), ppm, snap);\n const destino = edge\n ? computeResize(event.start, event.end, edge, delta, dl)\n : computeDrop(event.start, event.end, delta, dl);\n const inicio = aMinutos(destino.start);\n const fin = destino.end ? aMinutos(destino.end) : inicio + snapMinArrastre;\n onPreview({ startMin: Math.min(inicio, fin), endMin: Math.max(inicio, fin) });\n };\n const onUp = (e: PointerEvent) => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n scroller.stop();\n onPreview?.(null);\n // Suma el desplazamiento que el propio auto-scroll aplicó al contenedor:\n // el puntero no se movió más, pero el contenido sí, así que cuenta como drag extra.\n const deltaMin = pxToSnappedMinutes(e.clientY - startY + scroller.getScrolled(), ppm, snap);\n if (deltaMin === 0) return;\n\n const next = edge\n ? computeResize(event.start, event.end, edge, deltaMin, dl)\n : computeDrop(event.start, event.end, deltaMin, dl);\n\n // moveEvent valida overlap/constraint/allow; si no es válido, se revierte.\n if (api.moveEvent(event.id, next.start, next.end)) {\n const updated = api.getEventById(event.id);\n if (updated) api.trigger(edge ? \"eventResize\" : \"eventDrop\", { event: updated });\n }\n };\n\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n\n/** Rango en curso (minutos absolutos del dia) para dibujar el `selectMirror`. */\nexport interface RangePreview {\n startMin: number;\n endMin: number;\n}\n\ninterface RangeSelectOptions {\n api: CalendarApi;\n date: RsvDate;\n model: TimeGridModel;\n columnEl: HTMLElement;\n snap?: string | undefined;\n /**\n * Se llama con el rango en curso mientras se arrastra y con `null` al\n * terminar. La vista lo usa para pintar el \"fantasma\" (`selectMirror`).\n */\n onPreview?: ((range: RangePreview | null) => void) | undefined;\n}\n\n/** Selección de rango horario por arrastre en una columna de timeGrid. */\nexport function startTimeRangeSelect(ev: PointerEvent, options: RangeSelectOptions): void {\n // No iniciar si se pulsa sobre un evento existente.\n if ((ev.target as HTMLElement).closest('[data-rsv=\"event\"]')) return;\n const { api, date, model, columnEl, snap = \"00:15\" } = options;\n\n const total = model.maxMinutes - model.minMinutes;\n const snapMin = timeStringToMinutes(snap) || 15;\n\n // Recalcula la geometría en cada llamada: si el contenedor hizo auto-scroll,\n // `columnEl` cambió de posición y un `rect` capturado una sola vez quedaría obsoleto.\n const yToMin = (clientY: number): number => {\n const rect = columnEl.getBoundingClientRect();\n const ppm = rect.height === 0 ? 0 : rect.height / total;\n const raw = model.minMinutes + (ppm === 0 ? 0 : (clientY - rect.top) / ppm);\n const clamped = Math.max(model.minMinutes, Math.min(model.maxMinutes, raw));\n return Math.round(clamped / snapMin) * snapMin;\n };\n\n const startMin = yToMin(ev.clientY);\n let endMin = startMin;\n let moved = false;\n\n // Auto-scroll del cuerpo de timeGrid al arrastrar cerca de su borde superior/inferior.\n const scroller = startAutoScroll(scrollAncestor(columnEl));\n scroller.update(ev.clientY);\n\n const onMove = (e: PointerEvent): void => {\n scroller.update(e.clientY);\n const m = yToMin(e.clientY);\n if (m !== startMin) moved = true;\n endMin = m;\n if (moved) {\n options.onPreview?.({\n startMin: Math.min(startMin, endMin),\n endMin: Math.max(startMin, endMin),\n });\n }\n };\n const onUp = (): void => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n scroller.stop();\n options.onPreview?.(null);\n if (!moved) return; // un click simple lo gestiona dateClick\n const lo = Math.min(startMin, endMin);\n const hi = Math.max(startMin, endMin);\n const dayStart = dl.startOf(date, \"day\");\n api.select(\n dl.toISOString(dl.add(dayStart, { minutes: lo })),\n dl.toISOString(dl.add(dayStart, { minutes: hi })),\n );\n };\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n}\n","import {\n dl,\n getLocaleText,\n isWithinBusinessHours,\n resolveBusinessHours,\n timeStringToMinutes,\n type CalendarApi,\n type CalendarViewAdapter,\n type TimeGridModel,\n type TimeGridSeg,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport {\n dateFormatter,\n minutesToLabel,\n minutesToTimeString,\n timeFormatter,\n} from \"../../render/format.js\";\nimport { navLinkToDay } from \"../../render/nav.js\";\nimport { startEventDrag, startTimeRangeSelect } from \"../../interaction/drag.js\";\nimport {\n arrastreReciente,\n hacerColumnaDestino,\n hacerEventoArrastrable,\n monitorizarArrastres,\n} from \"../../interaction/pdnd-timegrid.js\";\nimport { handleEventKeydown } from \"../../interaction/keyboard.js\";\n\ninterface TimeGridViewProps {\n api: CalendarApi;\n model: TimeGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Rango de selección en curso (minutos absolutos del día), para el mirror. */\ninterface PreviewRange {\n dayIndex: number;\n startMin: number;\n endMin: number;\n}\n\n/** Vista con eje temporal vertical (semana/día). */\nexport function TimeGridView({ api, model, options }: TimeGridViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const headerFmt = dateFormatter(locale, options.dayHeaderFormat, {\n weekday: \"short\",\n day: \"numeric\",\n });\n const slotFmt = timeFormatter(locale, options.slotLabelFormat);\n const showAllDay = options.allDaySlot !== false;\n const bodyHeight = `calc(var(--spacing-rsv-slot, 2.5rem) * ${model.slots.length})`;\n const total = model.maxMinutes - model.minMinutes;\n const snapMin =\n timeStringToMinutes(options.snapDuration ?? options.slotDuration ?? \"00:15\") || 15;\n\n // Se resuelve una vez por render y no por columna: el horario es el mismo para\n // toda la vista.\n const horario = resolveBusinessHours(options.businessHours);\n const bloquearFuera = options.selectConstraint === \"businessHours\" && horario !== null;\n\n /** ¿Se puede crear algo en `minutes` del día `dia`? */\n const permiteCrear = (dia: Parameters<typeof dl.startOf>[0], minutes: number): boolean => {\n if (!bloquearFuera) return true;\n const fecha = dl.add(dl.startOf(dia, \"day\"), { minutes });\n return isWithinBusinessHours(fecha, null, horario, dl);\n };\n\n const bodyRef = useRef<HTMLDivElement>(null);\n // El modelo cambia en cada render; el adaptador de scroll se instala una vez\n // y lee siempre el modelo vigente a traves de esta ref.\n const modelRef = useRef(model);\n modelRef.current = model;\n\n const [preview, setPreview] = useState<PreviewRange | null>(null);\n /**\n * Rango destino mientras se arrastra un evento, y el id del que se arrastra.\n * Sin esto la tarjeta no da ninguna senal durante el gesto: se queda quieta y\n * salta a su nueva posicion solo al soltar.\n */\n const [drag, setDrag] = useState<{ id: string; preview: PreviewRange } | null>(null);\n const dragIdRef = useRef<string | null>(null);\n /** Limpiezas de los drop targets, una por columna. */\n const limpiezaColumnas = useRef(new Map<HTMLElement, () => void>());\n useEffect(() => {\n const mapa = limpiezaColumnas.current;\n return () => {\n for (const limpiar of mapa.values()) limpiar();\n mapa.clear();\n };\n }, []);\n\n // Un unico monitor para toda la vista: pdnd emite el arrastre en curso y\n // resuelve la columna destino, que es lo que permite mover a otro dia.\n useEffect(\n () =>\n monitorizarArrastres({\n api,\n getModel: () => modelRef.current,\n snap: options.snapDuration ?? options.slotDuration,\n onPreview: (rango) =>\n setDrag(rango ? { id: dragIdRef.current ?? \"\", preview: rango } : null),\n onDragging: (id) => {\n dragIdRef.current = id;\n if (id === null) setDrag(null);\n },\n }),\n [api, options.snapDuration, options.slotDuration],\n );\n\n // Adaptador de scroll: expone scrollToTime/getScrollTime a la CalendarApi.\n useEffect(() => {\n const body = bodyRef.current;\n if (!body) return;\n const adapter: CalendarViewAdapter = {\n scrollToTime(time: string): void {\n const m = modelRef.current;\n const span = m.maxMinutes - m.minMinutes;\n const content = body.scrollHeight;\n if (span <= 0 || content <= 0) return;\n const target = Math.max(m.minMinutes, Math.min(m.maxMinutes, timeStringToMinutes(time)));\n const top = ((target - m.minMinutes) / span) * content;\n body.scrollTop = Math.max(0, Math.min(top, content - body.clientHeight));\n },\n getScrollTime(): string | null {\n const m = modelRef.current;\n const span = m.maxMinutes - m.minMinutes;\n const content = body.scrollHeight;\n if (span <= 0 || content <= 0) return null;\n return minutesToTimeString(m.minMinutes + (body.scrollTop / content) * span);\n },\n };\n api.setViewAdapter(adapter);\n return () => api.setViewAdapter(null);\n }, [api]);\n\n // Posicion inicial del scroll (`scrollTime`). Solo al montar: a partir de ahi\n // el anfitrion controla el scroll con `api.scrollToTime(...)`.\n const scrollTime = options.scrollTime;\n useEffect(() => {\n if (!scrollTime) return;\n // Dos frames: el primero deja que el layout fije el alto del contenido.\n let inner = 0;\n const outer = requestAnimationFrame(() => {\n inner = requestAnimationFrame(() => api.scrollToTime(scrollTime));\n });\n return () => {\n cancelAnimationFrame(outer);\n cancelAnimationFrame(inner);\n };\n // Solo `api`: `scrollTime` es la posicion INICIAL. Incluirlo reposicionaria\n // el scroll cada vez que el anfitrion cambiase la opcion, peleandose con\n // el scroll manual del usuario.\n }, [api]);\n\n /** Minutos (ajustados al snap) del punto vertical del cursor en una columna. */\n const minutesAtPointer = (colEl: HTMLElement, clientY: number): number => {\n const rect = colEl.getBoundingClientRect();\n if (rect.height === 0 || total <= 0) return model.minMinutes;\n const raw = ((clientY - rect.top) / rect.height) * total;\n const snapped = Math.floor(Math.max(0, Math.min(total, raw)) / snapMin) * snapMin;\n return model.minMinutes + snapped;\n };\n\n const axisDay = model.days[0];\n\n return (\n <div data-rsv=\"timegrid\" style={`--rsv-tg-days:${model.days.length}`}>\n {/* Cabecera de dias */}\n <div data-rsv=\"tg-header\" role=\"row\">\n <div data-rsv=\"tg-axis-corner\" />\n {model.days.map((d) => {\n const date = dl.toDate(d.date);\n const text = headerFmt ? headerFmt(date) : \"\";\n const headerArg = {\n date,\n text,\n dayOfWeek: dl.dayOfWeek(d.date),\n dayNumber: dl.dayOfMonth(d.date),\n isToday: d.isToday,\n view,\n };\n return (\n <div\n data-rsv=\"tg-col-header\"\n role=\"columnheader\"\n data-today={String(d.isToday)}\n data-date={dl.toISOString(d.date)}\n data-nav-link={options.navLinks ? \"true\" : undefined}\n class={cx(options.classNames?.dayHeader)}\n key={dl.toISOString(d.date)}\n ref={(el) => callDidMount(el, options.hooks?.dayHeaderDidMount, () => headerArg)}\n onClick={options.navLinks ? () => navLinkToDay(api, d.date) : undefined}\n >\n {renderSlot(options.slots?.dayHeaderContent, headerArg, text, options.hostBridge)}\n </div>\n );\n })}\n </div>\n\n {/* Franja de todo el dia */}\n {showAllDay && (\n <div data-rsv=\"tg-allday\" role=\"row\">\n <div data-rsv=\"tg-axis-label\">{getLocaleText(options.locale).allDay}</div>\n {model.days.map((d) => (\n <div\n data-rsv=\"tg-allday-cell\"\n key={dl.toISOString(d.date)}\n onClick={() => api.trigger(\"dateClick\", { date: d.date, allDay: true })}\n >\n {d.allDayEvents\n .filter((event) => event.display !== \"none\")\n .map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day=\"true\"\n data-event-id={event.id}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-display={event.display}\n key={event.id}\n style={\n `--rsv-event-bg:${event.backgroundColor};` +\n `--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n {renderSlot(\n options.slots?.eventContent,\n { event, isAllDay: true, timeText: \"\", view },\n event.title,\n options.hostBridge,\n )}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Cuerpo: eje + columnas de dia */}\n <div data-rsv=\"tg-body\" ref={bodyRef}>\n <div data-rsv=\"tg-axis\" style={`height:${bodyHeight}`}>\n {model.slots.map((slot) => {\n const minutes = model.minMinutes + slot.offsetMin;\n let text = \"\";\n if (slot.isMajor) {\n text =\n slotFmt && axisDay\n ? slotFmt(dl.toDate(dl.add(dl.startOf(axisDay.date, \"day\"), { minutes })))\n : slot.label || minutesToLabel(minutes);\n }\n const labelArg = { text, minutes, isMajor: slot.isMajor, view };\n return (\n <div data-rsv=\"tg-slot\" data-major={String(slot.isMajor)} key={slot.offsetMin}>\n <span\n data-rsv=\"tg-slot-label\"\n class={cx(options.classNames?.slotLabel)}\n ref={(el) => callDidMount(el, options.hooks?.slotLabelDidMount, () => labelArg)}\n >\n {renderSlot(options.slots?.slotLabelContent, labelArg, text, options.hostBridge)}\n </span>\n </div>\n );\n })}\n </div>\n\n {model.days.map((d, dayIndex) => (\n <div\n data-rsv=\"tg-col\"\n data-today={String(d.isToday)}\n data-business={String(d.isBusiness)}\n data-date={dl.toISOString(d.date)}\n data-rsv-day-index={String(dayIndex)}\n ref={(el) => {\n // Preact llama a los refs en CADA render: sin esta guarda se\n // registraria un drop target nuevo por render sobre el mismo\n // elemento, acumulando registros.\n if (!el || limpiezaColumnas.current.has(el)) return;\n limpiezaColumnas.current.set(el, hacerColumnaDestino(el));\n }}\n style={`height:${bodyHeight}`}\n key={dl.toISOString(d.date)}\n onClick={(e) => {\n // Tras soltar una tarjeta el navegador dispara un click aqui:\n // sin esto se creaba un borrador justo despues de mover la cita.\n if (arrastreReciente()) return;\n // FullCalendar entrega en `dateClick` la hora del slot pulsado,\n // no el inicio del dia: se deriva de la posicion del cursor.\n const minutes = minutesAtPointer(e.currentTarget as HTMLElement, e.clientY);\n if (!permiteCrear(d.date, minutes)) return;\n api.trigger(\"dateClick\", {\n date: dl.add(dl.startOf(d.date, \"day\"), { minutes }),\n allDay: false,\n });\n }}\n onPointerDown={\n options.selectable\n ? (e) => {\n const minutes = minutesAtPointer(e.currentTarget as HTMLElement, e.clientY);\n if (!permiteCrear(d.date, minutes)) return;\n startTimeRangeSelect(e, {\n api,\n date: d.date,\n model,\n columnEl: e.currentTarget as HTMLElement,\n snap: options.snapDuration ?? options.slotDuration,\n onPreview: options.selectMirror\n ? (range) =>\n setPreview(\n range\n ? { dayIndex, startMin: range.startMin, endMin: range.endMin }\n : null,\n )\n : undefined,\n });\n }\n : undefined\n }\n >\n {d.nonBusinessPct.map((banda) => (\n <div\n data-rsv=\"tg-nonbusiness\"\n style={`top:${banda.topPct}%;height:${banda.heightPct}%`}\n key={banda.topPct}\n />\n ))}\n {preview?.dayIndex === dayIndex && total > 0 && (\n <div\n data-rsv=\"select-mirror\"\n style={\n `top:${((preview.startMin - model.minMinutes) / total) * 100}%;` +\n `height:${((preview.endMin - preview.startMin) / total) * 100}%`\n }\n />\n )}\n {d.timedSegs\n .filter((seg) => seg.event.display !== \"none\")\n .map((seg) => (\n <TimedEvent\n api={api}\n seg={seg}\n model={model}\n options={options}\n view={view}\n key={seg.event.id}\n dragging={drag?.id === seg.event.id}\n onDragPreview={(range) =>\n setDrag(range ? { id: seg.event.id, preview: { dayIndex, ...range } } : null)\n }\n />\n ))}\n {drag?.preview.dayIndex === dayIndex && total > 0 && (\n <div\n data-rsv=\"drag-mirror\"\n style={\n `top:${((drag.preview.startMin - model.minMinutes) / total) * 100}%;` +\n `height:${((drag.preview.endMin - drag.preview.startMin) / total) * 100}%`\n }\n />\n )}\n {model.nowIndicator?.dayIndex === dayIndex && (\n <div data-rsv=\"now-indicator\" style={`top:${model.nowIndicator.topPct}%`} />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction TimedEvent({\n api,\n seg,\n model,\n options,\n view,\n dragging,\n onDragPreview,\n}: {\n api: CalendarApi;\n seg: TimeGridSeg;\n model: TimeGridModel;\n options: ReserviCalendarOptions;\n view: ViewArg;\n /** El evento se esta arrastrando ahora mismo (para elevarlo con CSS). */\n dragging?: boolean;\n /** Rango destino en curso, o `null` al soltar. */\n onDragPreview?: (range: { startMin: number; endMin: number } | null) => void;\n}): VNode {\n const { event } = seg;\n const editable = options.editable === true && event.editable !== false;\n /**\n * Arrastrar es un permiso aparte del de redimensionar: `editable` es el\n * maestro y `eventDraggable` apaga solo el movimiento.\n */\n // Nota: `EventInput.startEditable` existe en el tipo publico pero\n // `normalizeEvent` no lo traslada a `EventDef`, asi que por ahora el permiso\n // por evento no se puede afinar; solo el global.\n const arrastrable = editable && options.eventDraggable === true;\n /** Limpieza del `draggable` de pdnd; se rehace si cambia el nodo. */\n const limpiarArrastre = useRef<(() => void) | null>(null);\n const nodoArrastre = useRef<HTMLElement | null>(null);\n useEffect(() => () => limpiarArrastre.current?.(), []);\n const selected = api.selectedEventIds.value.has(event.id);\n const widthPct = 100 / seg.colCount;\n const eventFmt = timeFormatter(options.locale ?? \"en\", options.eventTimeFormat);\n const timeText = eventFmt ? eventFmt(dl.toDate(event.start)) : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: false, timeText, view };\n const content = renderSlot(\n options.slots?.eventContent,\n contentArg,\n <span data-rsv=\"event-title\">\n {timeText} {event.title}\n </span>,\n options.hostBridge,\n );\n\n const getColumn = (el: HTMLElement): HTMLElement =>\n (el.closest('[data-rsv=\"tg-col\"]') as HTMLElement | null) ?? el;\n\n return (\n <div\n data-rsv=\"event\"\n data-all-day=\"false\"\n data-display={event.display}\n data-event-id={event.id}\n data-rsv-selected={String(selected)}\n data-rsv-dragging={dragging ? \"true\" : undefined}\n class={cx(options.classNames?.event, ...event.classNames)}\n role=\"button\"\n tabIndex={0}\n ref={(el) => {\n callDidMount(el, options.hooks?.eventDidMount, () => contentArg);\n // Solo se re-registra si cambia el NODO. Preact llama a los refs en cada\n // render, y destruir y recrear el `draggable` a mitad de un arrastre lo\n // cancelaria.\n if (el === nodoArrastre.current) return;\n limpiarArrastre.current?.();\n nodoArrastre.current = el;\n limpiarArrastre.current = el ? hacerEventoArrastrable(el, event, arrastrable) : null;\n }}\n style={\n `position:absolute;` +\n `top:${seg.topPct}%;height:${seg.heightPct}%;` +\n `left:${seg.col * widthPct}%;width:${widthPct}%;` +\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n // Igual que en la columna: el click que sigue a un arrastre abriria el\n // detalle de la cita que se acaba de mover.\n if (arrastreReciente()) return;\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n onKeyDown={\n editable\n ? (e) =>\n handleEventKeydown(e, {\n api,\n event,\n kind: \"timeGrid\",\n snap: options.snapDuration ?? options.slotDuration,\n shortcuts: options.keyboardShortcuts,\n })\n : undefined\n }\n >\n {editable && (\n <span\n data-rsv=\"resize-handle\"\n data-edge=\"start\"\n onPointerDown={(e) =>\n startEventDrag(e, {\n api,\n event,\n model,\n columnEl: getColumn(e.currentTarget as HTMLElement),\n snap: options.snapDuration,\n onPreview: onDragPreview,\n edge: \"start\",\n })\n }\n />\n )}\n {content}\n {editable && (\n <span\n data-rsv=\"resize-handle\"\n data-edge=\"end\"\n onPointerDown={(e) =>\n startEventDrag(e, {\n api,\n event,\n model,\n columnEl: getColumn(e.currentTarget as HTMLElement),\n snap: options.snapDuration,\n onPreview: onDragPreview,\n edge: \"end\",\n })\n }\n />\n )}\n </div>\n );\n}\n","import { dl, getLocaleText, type CalendarApi, type ListModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions, ViewArg } from \"../../types.js\";\nimport { renderSlot, cx, callDidMount } from \"../../render/slots.js\";\nimport { dateFormatter, timeFormatter } from \"../../render/format.js\";\n\ninterface ListViewProps {\n api: CalendarApi;\n model: ListModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de agenda en lista (listDay/Week/Month/Year). */\nexport function ListView({ api, model, options }: ListViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const view: ViewArg = { type: api.getView().type };\n const text = getLocaleText(options.locale);\n const dayFmt = dateFormatter(locale, options.listDayFormat, {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n // Texto secundario de la cabecera (a la derecha); solo si se pide.\n const daySideFmt = options.listDaySideFormat\n ? dateFormatter(locale, options.listDaySideFormat, { month: \"short\", day: \"2-digit\" })\n : null;\n const eventFmt = timeFormatter(locale, options.eventTimeFormat);\n\n if (model.isEmpty) {\n return (\n <div data-rsv=\"list\">\n <div data-rsv=\"list-empty\">{text.noEvents}</div>\n </div>\n );\n }\n\n return (\n <div data-rsv=\"list\" role=\"list\">\n {model.days.map((day) => (\n <div data-rsv=\"list-day\" data-today={String(day.isToday)} key={dl.toISOString(day.date)}>\n <div data-rsv=\"list-day-header\" role=\"heading\" aria-level={3}>\n <span data-rsv=\"list-day-text\">\n {dayFmt ? dayFmt(dl.toDate(day.date)) : \"\"}\n </span>\n {daySideFmt && (\n <span data-rsv=\"list-day-side-text\">{daySideFmt(dl.toDate(day.date))}</span>\n )}\n </div>\n {day.events\n .filter((event) => event.display !== \"none\")\n .map((event) => {\n const timeText = event.allDay\n ? text.allDay\n : eventFmt\n ? eventFmt(dl.toDate(event.start))\n : dl.format(event.start, \"HH:mm\");\n const contentArg = { event, isAllDay: event.allDay, timeText, view };\n return (\n <div\n data-rsv=\"list-item\"\n role=\"listitem\"\n tabIndex={0}\n key={event.id}\n data-event-id={event.id}\n class={cx(options.classNames?.event, ...event.classNames)}\n data-display={event.display}\n ref={(el) => callDidMount(el, options.hooks?.eventDidMount, () => contentArg)}\n style={\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => {\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n <span data-rsv=\"list-item-time\">{timeText}</span>\n <span\n data-rsv=\"list-item-dot\"\n style={`--rsv-event-bg:${event.backgroundColor}`}\n />\n {/* div y no span: el `eventContent` del anfitrion suele\n devolver contenido de bloque. */}\n <div data-rsv=\"list-item-title\">\n {renderSlot(\n options.slots?.eventContent,\n contentArg,\n event.title,\n options.hostBridge,\n )}\n </div>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import { dl, type CalendarApi, type MultiMonthModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { DayGridView } from \"../daygrid/DayGridView.js\";\n\ninterface MultiMonthViewProps {\n api: CalendarApi;\n model: MultiMonthModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista de varios meses (año): rejilla responsive de cuadrículas mensuales. */\nexport function MultiMonthView({ api, model, options }: MultiMonthViewProps): VNode {\n const locale = options.locale ?? \"en\";\n const monthFmt = new Intl.DateTimeFormat(locale, { month: \"long\" });\n\n return (\n <div data-rsv=\"multimonth\">\n {model.months.map((month) => (\n <section data-rsv=\"mm-month\" key={dl.toISOString(month.date)}>\n <header data-rsv=\"mm-title\">{monthFmt.format(dl.toDate(month.date))}</header>\n <DayGridView api={api} model={month.dayGrid} options={options} />\n </section>\n ))}\n </div>\n );\n}\n","import { type CalendarApi, type TimelineModel, type TimelineSeg } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { renderSlot } from \"../../render/slots.js\";\n\nconst LANE_REM = 1.6;\n\ninterface TimelineViewProps {\n api: CalendarApi;\n model: TimelineModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista timeline: eje temporal horizontal con eventos apilados en carriles. */\nexport function TimelineView({ api, model, options }: TimelineViewProps): VNode {\n return (\n <div data-rsv=\"timeline\">\n <div data-rsv=\"tl-axis\" role=\"row\">\n {model.slots.map((slot) => (\n <div data-rsv=\"tl-slot\" style={`left:${slot.leftPct}%`} key={slot.leftPct}>\n {slot.label}\n </div>\n ))}\n </div>\n <div data-rsv=\"tl-body\" style={`height:${model.laneCount * LANE_REM + 0.5}rem`}>\n {model.segs.map((seg) => (\n <TimelineEvent api={api} seg={seg} options={options} key={seg.event.id} />\n ))}\n </div>\n </div>\n );\n}\n\nexport function TimelineEvent({\n api,\n seg,\n options,\n}: {\n api: CalendarApi;\n seg: TimelineSeg;\n options: ReserviCalendarOptions;\n}): VNode {\n const { event } = seg;\n return (\n <div\n data-rsv=\"event\"\n data-event-id={event.id}\n role=\"button\"\n tabIndex={0}\n style={\n `position:absolute;left:${seg.leftPct}%;width:${seg.widthPct}%;` +\n `top:${seg.lane * LANE_REM}rem;height:${LANE_REM - 0.2}rem;` +\n `--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};` +\n `--rsv-event-border:${event.borderColor}`\n }\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {renderSlot(\n options.slots?.eventContent,\n { event, isAllDay: event.allDay, timeText: \"\", view: { type: api.getView().type } },\n event.title,\n options.hostBridge,\n )}\n </div>\n );\n}\n","import { type CalendarApi, type ResourceTimelineModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\nimport { TimelineEvent } from \"../timeline/TimelineView.js\";\n\nconst LANE_REM = 1.6;\n\ninterface ResourceTimelineViewProps {\n api: CalendarApi;\n model: ResourceTimelineModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista resource-timeline (Scheduler): filas de recursos × eje temporal. */\nexport function ResourceTimelineView({ api, model, options }: ResourceTimelineViewProps): VNode {\n return (\n <div data-rsv=\"resource-timeline\">\n {/* Cabecera: área de recursos + eje temporal */}\n <div data-rsv=\"rt-header\" role=\"row\">\n <div data-rsv=\"resource-area-header\">\n {options.locale === \"es\" ? \"Recursos\" : \"Resources\"}\n </div>\n <div data-rsv=\"tl-axis\">\n {model.slots.map((slot) => (\n <div data-rsv=\"tl-slot\" style={`left:${slot.leftPct}%`} key={slot.leftPct}>\n {slot.label}\n </div>\n ))}\n </div>\n </div>\n\n {/* Filas de recursos */}\n {model.lanes.map((lane) => {\n const rowHeight = lane.laneCount * LANE_REM + 0.4;\n return (\n <div data-rsv=\"resource-row\" role=\"row\" key={lane.row.resource.id}>\n <div\n data-rsv=\"resource-label\"\n style={`padding-inline-start:${0.5 + lane.row.depth * 1}rem`}\n >\n {lane.row.hasChildren && (\n <button\n type=\"button\"\n data-rsv=\"resource-toggle\"\n aria-expanded={lane.row.expanded}\n onClick={() => api.toggleResource(lane.row.resource.id)}\n >\n {lane.row.expanded ? \"▾\" : \"▸\"}\n </button>\n )}\n <span data-rsv=\"resource-title\">{lane.row.resource.title}</span>\n </div>\n <div data-rsv=\"resource-lane\" style={`height:${rowHeight}rem`}>\n {lane.segs.map((seg) => (\n <TimelineEvent api={api} seg={seg} options={options} key={seg.event.id} />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { dl, getLocaleText, type CalendarApi, type ResourceTimeGridModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceTimeGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista vertical de recursos: recursos como columnas sobre un eje de tiempo. */\nexport function ResourceTimeGridView({ api, model, options }: Props): VNode {\n const bodyHeight = `calc(var(--spacing-rsv-slot, 2.5rem) * ${model.slots.length})`;\n\n return (\n <div data-rsv=\"timegrid\" style={`--rsv-tg-days:${model.columns.length}`}>\n <div data-rsv=\"tg-header\" role=\"row\">\n <div data-rsv=\"tg-axis-corner\" />\n {model.columns.map((col) => (\n <div data-rsv=\"tg-col-header\" role=\"columnheader\" key={col.row.resource.id}>\n {col.row.resource.title}\n </div>\n ))}\n </div>\n\n <div data-rsv=\"tg-allday\" role=\"row\">\n <div data-rsv=\"tg-axis-label\">{getLocaleText(options.locale).allDay}</div>\n {model.columns.map((col) => (\n <div data-rsv=\"tg-allday-cell\" key={col.row.resource.id}>\n {col.allDayEvents.map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day=\"true\"\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor}`}\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {event.title}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n <div data-rsv=\"tg-body\">\n <div data-rsv=\"tg-axis\" style={`height:${bodyHeight}`}>\n {model.slots.map((slot) => (\n <div data-rsv=\"tg-slot\" data-major={String(slot.isMajor)} key={slot.offsetMin}>\n <span data-rsv=\"tg-slot-label\">{slot.label}</span>\n </div>\n ))}\n </div>\n\n {model.columns.map((col) => (\n <div\n data-rsv=\"tg-col\"\n data-rsv-resource-id={col.row.resource.id}\n style={`height:${bodyHeight}`}\n key={col.row.resource.id}\n >\n {col.timedSegs.map((seg) => {\n const widthPct = 100 / seg.colCount;\n return (\n <div\n data-rsv=\"event\"\n data-all-day=\"false\"\n data-event-id={seg.event.id}\n role=\"button\"\n tabIndex={0}\n key={seg.event.id}\n style={\n `position:absolute;top:${seg.topPct}%;height:${seg.heightPct}%;` +\n `left:${seg.col * widthPct}%;width:${widthPct}%;` +\n `--rsv-event-bg:${seg.event.backgroundColor};--rsv-event-fg:${seg.event.textColor}`\n }\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"eventClick\", { event: seg.event });\n }}\n >\n {dl.format(seg.event.start, \"HH:mm\")} {seg.event.title}\n </div>\n );\n })}\n {model.nowTopPct != null && (\n <div data-rsv=\"now-indicator\" style={`top:${model.nowTopPct}%`} />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { dl, type CalendarApi, type ResourceDayGridModel } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceDayGridModel;\n options: ReserviCalendarOptions;\n}\n\n/** Recursos como columnas en cuadrícula de día (eventos apilados por recurso). */\nexport function ResourceDayGridView({ api, model }: Props): VNode {\n return (\n <div data-rsv=\"resource-daygrid\" style={`--rsv-rdg-cols:${model.columns.length}`}>\n <div data-rsv=\"rdg-header\" role=\"row\">\n {model.columns.map((col) => (\n <div data-rsv=\"rdg-col-header\" role=\"columnheader\" key={col.row.resource.id}>\n {col.row.resource.title}\n </div>\n ))}\n </div>\n <div data-rsv=\"rdg-body\" role=\"row\">\n {model.columns.map((col) => (\n <div\n data-rsv=\"rdg-col\"\n data-rsv-resource-id={col.row.resource.id}\n key={col.row.resource.id}\n >\n {col.events.map((event) => (\n <div\n data-rsv=\"event\"\n data-all-day={String(event.allDay)}\n data-event-id={event.id}\n role=\"button\"\n tabIndex={0}\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};--rsv-event-border:${event.borderColor}`}\n onClick={(e) => api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement })}\n >\n {event.allDay ? \"\" : dl.format(event.start, \"HH:mm\") + \" \"}\n {event.title}\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import {\n dl,\n getLocaleText,\n type CalendarApi,\n type ResourceDayGridMonthCell,\n type ResourceDayGridMonthModel,\n} from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport type { ReserviCalendarOptions } from \"../../types.js\";\n\ninterface Props {\n api: CalendarApi;\n model: ResourceDayGridMonthModel;\n options: ReserviCalendarOptions;\n}\n\n/** Vista mensual con recursos como columnas anidadas dentro de cada día. */\nexport function ResourceDayGridMonthView({ api, model, options }: Props): VNode {\n return (\n <div data-rsv=\"resource-daygrid-month\" style={`--rsv-rdgm-cols:${model.columnCount}`}>\n {model.weeks.map((week, wi) => (\n <div data-rsv=\"rdgm-week\" role=\"row\" key={`week-${wi}`}>\n {week.days.map((cell) => (\n <ResourceMonthCell\n api={api}\n cell={cell}\n options={options}\n key={dl.toISOString(cell.date)}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ResourceMonthCell({\n api,\n cell,\n options,\n}: {\n api: CalendarApi;\n cell: ResourceDayGridMonthCell;\n options: ReserviCalendarOptions;\n}): VNode {\n const dayNumber = dl.dayOfMonth(cell.date);\n return (\n <div\n data-rsv=\"day\"\n role=\"gridcell\"\n data-date={dl.toISOString(cell.date)}\n data-today={String(cell.isToday)}\n data-other={String(cell.isOther)}\n >\n <span data-rsv=\"day-number\">{dayNumber}</span>\n <div data-rsv=\"rdgm-columns\">\n {cell.columns.map((col) => (\n <div data-rsv=\"rdgm-col\" data-rsv-resource-id={col.row.resource.id} key={col.row.resource.id}>\n <span data-rsv=\"rdgm-col-label\">{col.row.resource.title}</span>\n {col.events.map((event) => {\n const selected = api.selectedEventIds.value.has(event.id);\n return (\n <div\n data-rsv=\"event\"\n data-all-day={String(event.allDay)}\n data-event-id={event.id}\n data-rsv-selected={String(selected)}\n role=\"button\"\n tabIndex={0}\n key={event.id}\n style={`--rsv-event-bg:${event.backgroundColor};--rsv-event-fg:${event.textColor};--rsv-event-border:${event.borderColor}`}\n onClick={(e) => {\n e.stopPropagation();\n if (e.ctrlKey || e.metaKey) {\n api.toggleEventSelection(event.id);\n return;\n }\n api.trigger(\"eventClick\", { event, el: e.currentTarget as HTMLElement });\n if (event.url) window.open(event.url, \"_self\");\n }}\n >\n {event.allDay ? \"\" : `${dl.format(event.start, \"HH:mm\")} `}\n {event.title}\n </div>\n );\n })}\n {col.moreCount > 0 && (\n <span\n data-rsv=\"rdgm-more\"\n onClick={(e) => {\n e.stopPropagation();\n api.trigger(\"moreLinkClick\", {\n date: cell.date,\n allEvents: [...col.events, ...col.hiddenEvents],\n hiddenEvents: col.hiddenEvents,\n });\n }}\n >\n {getLocaleText(options.locale).more(col.moreCount)}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","// Importar @preact/signals activa el seguimiento automático de signals en los\n// componentes: leer `api.viewModel.value` re-renderiza de forma granular.\nimport \"@preact/signals\";\nimport { getLocaleText, themeToStyle, THEME_TOKEN_VARS, type CalendarApi } from \"@reservi/core\";\nimport type { VNode } from \"preact\";\nimport { useEffect, useRef } from \"preact/hooks\";\nimport type { ReserviCalendarOptions } from \"../types.js\";\nimport { cx } from \"../render/slots.js\";\nimport { pickResponsiveView } from \"../interaction/responsive.js\";\nimport { Toolbar } from \"./Toolbar.js\";\nimport { DayGridView } from \"../views/daygrid/DayGridView.js\";\nimport { TimeGridView } from \"../views/timegrid/TimeGridView.js\";\nimport { ListView } from \"../views/list/ListView.js\";\nimport { MultiMonthView } from \"../views/multimonth/MultiMonthView.js\";\nimport { TimelineView } from \"../views/timeline/TimelineView.js\";\nimport { ResourceTimelineView } from \"../views/resource/ResourceTimelineView.js\";\nimport { ResourceTimeGridView } from \"../views/resource/ResourceTimeGridView.js\";\nimport { ResourceDayGridView } from \"../views/resource/ResourceDayGridView.js\";\nimport { ResourceDayGridMonthView } from \"../views/resource/ResourceDayGridMonthView.js\";\n\ninterface CalendarProps {\n api: CalendarApi;\n options: ReserviCalendarOptions;\n}\n\n/** Componente raíz: lee el ViewModel reactivo y delega en la vista activa. */\nexport function Calendar({ api, options }: CalendarProps): VNode {\n const vm = api.viewModel.value; // reactivo (signals)\n const dir = options.direction ?? getLocaleText(options.locale).direction;\n const hourHeight = api.getEffectiveOption(\"hourHeight\", vm.type);\n const height = api.getEffectiveOption(\"height\", vm.type);\n const themeStyle =\n [\n options.themeTokens ? themeToStyle(options.themeTokens) : \"\",\n hourHeight ? `${THEME_TOKEN_VARS.slotHeight}:${hourHeight}px` : \"\",\n height != null && height !== \"auto\"\n ? `height:${typeof height === \"number\" ? `${height}px` : height}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\";\") || undefined;\n\n const rootRef = useRef<HTMLDivElement>(null);\n\n // La CalendarApi expone `el` (como FullCalendar) para que el anfitrion pueda\n // aplicar clases o medir el contenedor.\n useEffect(() => {\n api.setRootEl(rootRef.current);\n return () => api.setRootEl(null);\n }, [api]);\n // Ref para leer siempre el `responsiveViews` más reciente sin re-crear el\n // ResizeObserver en cada render (solo se monta una vez por instancia de `api`).\n const responsiveViewsRef = useRef(options.responsiveViews);\n responsiveViewsRef.current = options.responsiveViews;\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof ResizeObserver === \"undefined\") return;\n let frame = 0;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n const width = entry?.contentRect.width ?? root.clientWidth;\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const config = responsiveViewsRef.current;\n if (!config?.length) return;\n const next = pickResponsiveView(config, width);\n if (next && next !== api.getView().type && api.hasView(next)) api.changeView(next);\n });\n });\n observer.observe(root);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [api]);\n\n return (\n <div\n ref={rootRef}\n data-rsv=\"root\"\n dir={dir}\n data-rsv-theme={options.theme}\n data-rsv-autoheight={height === \"auto\" ? \"true\" : undefined}\n style={themeStyle}\n class={cx(options.classNames?.root)}\n >\n {options.headerToolbar !== false && (\n <Toolbar api={api} title={vm.title} activeView={vm.type} options={options} />\n )}\n <div data-rsv=\"view\" data-view={vm.type}>\n {vm.dayGrid ? (\n <DayGridView api={api} model={vm.dayGrid} options={options} />\n ) : vm.timeGrid ? (\n <TimeGridView api={api} model={vm.timeGrid} options={options} />\n ) : vm.list ? (\n <ListView api={api} model={vm.list} options={options} />\n ) : vm.multiMonth ? (\n <MultiMonthView api={api} model={vm.multiMonth} options={options} />\n ) : vm.resourceTimeGrid ? (\n <ResourceTimeGridView api={api} model={vm.resourceTimeGrid} options={options} />\n ) : vm.resourceDayGrid ? (\n <ResourceDayGridView api={api} model={vm.resourceDayGrid} options={options} />\n ) : vm.resourceDayGridMonth ? (\n <ResourceDayGridMonthView api={api} model={vm.resourceDayGridMonth} options={options} />\n ) : vm.resourceTimeline ? (\n <ResourceTimelineView api={api} model={vm.resourceTimeline} options={options} />\n ) : vm.timeline ? (\n <TimelineView api={api} model={vm.timeline} options={options} />\n ) : (\n <div data-rsv=\"unsupported\">\n La vista \"{vm.type}\" se implementa en una fase posterior.\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { h, render } from \"preact\";\nimport { CalendarApi } from \"@reservi/core\";\nimport { Calendar } from \"./components/Calendar.js\";\nimport type { ReserviCalendarOptions } from \"./types.js\";\n\nexport interface ReserviCalendarHandle {\n /** API del calendario (navegación, eventos, callbacks). */\n readonly api: CalendarApi;\n /** Desmonta el calendario y libera recursos. */\n destroy(): void;\n}\n\n/**\n * Monta un calendario Reservi en un elemento del DOM. API agnóstica usada\n * directamente (vanilla/Preact) y por los wrappers de framework.\n */\nexport function mount(el: HTMLElement, options: ReserviCalendarOptions): ReserviCalendarHandle {\n const api = new CalendarApi(options);\n render(h(Calendar, { api, options }), el);\n\n return {\n api,\n destroy() {\n render(null, el);\n api.destroy();\n },\n };\n}\n","import { eventsToICS, type EventInput } from \"@reservi/core\";\n\n/**\n * Exporta eventos a un archivo `.ics` y dispara la descarga en el navegador.\n * Capa de UI (usa DOM); la serialización pura vive en `@reservi/core`.\n */\nexport function downloadICS(events: EventInput[], filename = \"calendar.ics\"): void {\n if (typeof document === \"undefined\") return;\n const ics = eventsToICS(events);\n const blob = new Blob([ics], { type: \"text/calendar;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n}\n\nexport { parseICS, eventsToICS } from \"@reservi/core\";\n"],"names":["hostSlot","node","isHostSlot","value","renderSlot","slot","arg","fallback","bridge","result","jsx","HostSlotOutlet","hostSeq","idRef","useRef","elRef","nodeRef","liveRef","useLayoutEffect","el","id","cx","classes","notified","callDidMount","hook","buildArg","html","pickResponsiveView","entries","width","sorted","b","chosen","entry","NAV_SYMBOLS","NON_VIEW_TOKENS","MONTH_VIEW_RE","pad2","n","CalendarIcon","jsxs","resolveViews","options","_a","tb","s","g","t","Toolbar","api","title","activeView","text","getLocaleText","startSlot","_b","endSlot","_d","_c","views","monthMode","firstDay","wrapRef","open","setOpen","useState","selected","dl","nowRef","viewYear","setViewYear","viewMonth","setViewMonth","monthShortFmt","monthLongFmt","dowFmt","monthNames","_","i","openPicker","d","shiftMonth","delta","total","goto","iso","useEffect","onKey","e","onPointer","dayGrid","first","offset","start","cells","dows","_e","y","label","v","minutesToLabel","minutes","minutesToTimeString","m","timeFormatter","locale","fmt","date","dateFormatter","navLinkToDay","target","DAY","DEFAULT_SHORTCUTS","resolveAction","key","shortcuts","action","defaultKeys","handleEventKeydown","opts","event","kind","snapMin","timeStringToMinutes","deltaMin","next","computeDrop","updated","dateAtPoint","x","startDayRangeSelect","ev","endStr","moved","onMove","onUp","a","lo","hi","_arrayWithHoles","r","_iterableToArrayLimit","l","u","f","o","_arrayLikeToArray","_unsupportedIterableToArray","arrayLikeToArray","_nonIterableRest","_slicedToArray","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","bind_1","bind","type","listener","__assign","this","p","bindAll_1","require$$0","toOptions","getBinding","original","sharedOptions","binding","bindAll","bindings","unbinds","unbind","exports","bind_all_1","require$$1","honeyPotDataAttribute","isHoneyPotElement","getElementFromPointWithoutHoneypot","client","_document$elementsFro","_document$elementsFro2","top","second","_typeof","toPrimitive","toPropertyKey","_defineProperty","maxZIndex","popoverResetUserAgentStyles","once","fn","cache","_len","args","_key","supportsPopover","ownKeys","_objectSpread","honeyPotSize","halfHoneyPotSize","floorToClosestPixel","point","pullBackByHalfHoneyPotSize","preventGoingBackwardsOffScreen","preventGoingForwardsOffScreen","getHoneyPotRectFor","_ref","getRectStyles","_ref2","clientRect","isWithin","_ref3","mountHoneyPot","_ref4","initial","element","unbindPointerMove","_ref5","current","cleanup","unbindPostDragEvents","makeHoneyPotFix","latestPointerMove","bindEvents","getOnPostDispatch","finish","_ref6","eventName","payload","input","_finish","_input","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_toConsumableArray","arrayWithoutHoles","iterableToArray","nonIterableSpread","isFirefox","isSafari","_navigator","userAgent","isNodeLike","isFromAnotherWindow","eventTarget","symbols","getInitialState","state","resetState","isLeavingWindowInSafari","dragLeave","isLeavingWindow","relatedTarget","getBindingsForBrokenDrags","onDragEnd","callCount","getInput","rafSchd","lastArgs","frameId","wrapperFn","scheduleOnDrag","dragStart","scheduled","schedule","flush","makeDispatch","source","dispatchEvent","previous","safeDispatch","dispatch","nativeSetDragImage","location","updatedSourcePayload","globalState","canStart","getNativeSetDragImage","hasHierarchyChanged","dragType","getDropTargetsOver","getStartLocation","setDropEffectOnEvent","updateState","hasChanged","onUpdateEvent","nextDropTargets","cancel","unbindEvents","_current$","innerMost","dropTargets","lifecycle","ledger","registerUsage","typeKey","mount","register","combine","fns","addAttribute","attribute","_createForOfIteratorHelper","_n","F","copyReverse","array","makeDropTarget","defaultDropEffect","registry","dropTargetDataAtt","dropTargetSelector","addToRegistry","dropTargetForConsumers","existing","getActualDropTargets","_args$getData","_args$getData2","_args$getDropEffect","_args$getDropEffect2","_ref2$result","closest","feedback","data","dropEffect","record","notifyCurrent","_iterator","_step","_entry$eventName","err","actions","isCurrent","visited","_iterator2","_step2","_entry$onDropTargetCh","isOver","_entry$onDragLeave","_iterator3","_step3","_entry$onDropTargetCh2","_entry$onDragEnter","_record","_args","_entry","getIsOver","actual","lastCaptureOrdered","actualCaptureOrdered","resultCaptureOrdered","index","_argsForLast$getIsSti","last","fresh","parent","lastParent","argsForLast","makeMonitor","dragging","tryAddToActive","monitor","monitorForConsumers","active","_i","_active","_monitor","_monitor$eventName","makeAdapter","dispatchEventToSource","onPostDispatch","monitorAPI","dropTargetAPI","mountAdapter","isAndroid","androidFallbackText","textMediaType","URLMediaType","elementAdapterNativeDataKey","draggableRegistry","honeyPotFix","adapter","_entry$dragHandle","_entry$getInitialData","_entry$getInitialData2","_entry$dragHandle2","_entry$getInitialData3","_entry$getInitialData4","over","nativeData","_Object$entries","_Object$entries$_i","_draggableRegistry$ge","_draggableRegistry$ge2","dropTargetForElements","monitorForElements","draggable","defaultOffset","setCustomNativeDragPreview","render","_ref$getOffset","getOffset","container","unmount","previewOffset","rect","unbindMonitor","preserveOffsetOnSource","sourceRect","containerRect","offsetX","offsetY","instanteUltimoArrastre","marcarArrastre","arrastreReciente","ventanaMs","TIPO_EVENTO","TIPO_COLUMNA","hacerEventoArrastrable","editable","copia","hacerColumnaDestino","minutosEnColumna","columnaEl","clientY","model","crudo","acotado","duracionMin","desde","hasta","calcularDestino","dia","minutosEnDia","nuevoInicio","duracion","monitorizarArrastres","getModel","snap","onPreview","onDragging","destino","inicio","siguiente","actualizado","TIPO_DIA","calcularDestinoDia","dias","hacerDiaDestino","monitorizarArrastresDia","DayGridView","view","headerDays","showWeekNums","showDayHeaders","dayNumberAlign","diaDestino","setDiaDestino","idArrastrado","setIdArrastrado","limpiezaDias","mapa","limpiar","cell","headerArg","week","wi","DayCell","dropActivo","dayNumber","defaultNumber","cellArg","numberNode","moreOpen","setMoreOpen","dateStr","rangeSelectedRef","onDayClick","openMore","EventChip","DayMorePopover","onClose","ref","dayFmt","allEvents","arrastrandose","arrastrable","limpiarArrastre","nodoArrastre","draggedRef","eventFmt","timeText","contentArg","content","EDGE_PX","MAX_SPEED_PX","NOOP_SCROLLER","startAutoScroll","lastY","scrolled","raf","tick","before","scrollAncestor","startEventDrag","columnEl","edge","totalMinutes","ppm","startY","scroller","snapMinArrastre","aMinutos","fecha","pxToSnappedMinutes","computeResize","fin","startTimeRangeSelect","yToMin","raw","clamped","startMin","endMin","dayStart","TimeGridView","headerFmt","slotFmt","showAllDay","bodyHeight","horario","resolveBusinessHours","bloquearFuera","permiteCrear","isWithinBusinessHours","bodyRef","modelRef","preview","setPreview","drag","setDrag","dragIdRef","limpiezaColumnas","rango","body","time","span","scrollTime","inner","outer","minutesAtPointer","colEl","snapped","axisDay","labelArg","dayIndex","range","banda","seg","TimedEvent","onDragPreview","widthPct","getColumn","ListView","daySideFmt","day","MultiMonthView","monthFmt","month","LANE_REM","TimelineView","TimelineEvent","ResourceTimelineView","lane","rowHeight","ResourceTimeGridView","col","ResourceDayGridView","ResourceDayGridMonthView","ResourceMonthCell","Calendar","vm","dir","hourHeight","height","themeStyle","themeToStyle","THEME_TOKEN_VARS","rootRef","responsiveViewsRef","root","frame","observer","config","CalendarApi","h","downloadICS","events","filename","ics","eventsToICS","blob","url"],"mappings":"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","x_google_ignoreList":[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56]}