@reservi/react 2.0.0-beta.3 → 2.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),c=require("react"),G=require("react-dom"),h=require("@reservi/preact"),o=require("@reservi/core"),F=t=>t?o.dl.toDate(t):null,A=t=>t?o.dl.toISOString(t):"";function f(t){return{id:t.id,groupId:t.groupId,title:t.title,start:F(t.start),end:F(t.end),startStr:A(t.start),endStr:A(t.end),allDay:t.allDay,url:t.url,display:t.display,backgroundColor:t.backgroundColor,borderColor:t.borderColor,textColor:t.textColor,classNames:t.classNames,extendedProps:t.extendedProps,def:t}}function M(t,l,v){const C={type:t.type};return l?{...C,...v==null?{}:{title:v},currentStart:o.dl.toDate(l.currentStart),currentEnd:o.dl.toDate(l.currentEnd),activeStart:o.dl.toDate(l.activeStart),activeEnd:o.dl.toDate(l.activeEnd)}:v==null?C:{...C,title:v}}const _=["eventContent","dayCellContent","dayHeaderContent","slotLabelContent","moreLinkContent"],V=["locale","direction","timeZone","firstDay","weekends","hiddenDays","fixedWeekCount","showNonCurrentDates","weekNumbers","weekNumberCalculation","navLinks","dayMaxEvents","dayMaxEventRows","slotMinTime","slotMaxTime","slotDuration","slotLabelInterval","allDaySlot","nowIndicator","scrollTime","editable","eventDraggable","selectable","selectMirror","snapDuration","businessHours","eventOverlap","eventConstraint","eventAllow","theme","themeTokens","headerToolbar","hourHeight","height","eventTimeFormat","slotLabelFormat","dayHeaderFormat","listDayFormat","listDaySideFormat","titleFormat","viewOverrides","keyboardShortcuts","resourceAreaWidth","resourceOrder","lazyFetching","classNames","views","addButtonText","responsiveViews"];function B(t,l){return t.getOption(l)}const W=c.forwardRef(function(l,v){const C=c.useRef(null),g=c.useRef(null),a=c.useRef(l);a.current=l;const b=c.useRef(new Map),[,D]=c.useState(0),O=c.useRef(!1),P=c.useRef(!0),w=c.useCallback(()=>{O.current||(O.current=!0,queueMicrotask(()=>{O.current=!1,P.current&&D(i=>i+1)}))},[]),H=c.useMemo(()=>({mount(i,d,m){b.current.set(i,{el:d,payload:m}),w()},update(i,d){const m=b.current.get(i);m&&(m.payload=d,w())},unmount(i){b.current.delete(i)&&w()}}),[w]);c.useEffect(()=>{var j,x;const i=C.current;if(!i)return;P.current=!0;const d={eventContent:e=>a.current.eventContent?h.hostSlot({slot:"eventContent",arg:e}):void 0,dayCellContent:e=>a.current.dayCellContent?h.hostSlot({slot:"dayCellContent",arg:e}):void 0,dayHeaderContent:e=>a.current.dayHeaderContent?h.hostSlot({slot:"dayHeaderContent",arg:e}):void 0,slotLabelContent:e=>a.current.slotLabelContent?h.hostSlot({slot:"slotLabelContent",arg:e}):void 0,moreLinkContent:e=>a.current.moreLinkContent?h.hostSlot({slot:"moreLinkContent",arg:e}):void 0},m={...Z(a.current),slots:d,hostBridge:H,hooks:{eventDidMount:e=>{const n=a.current.eventDidMount;n&&n({...q(e),el:e.el})},dayCellDidMount:e=>{var n,r;return(r=(n=a.current).dayCellDidMount)==null?void 0:r.call(n,e)},dayHeaderDidMount:e=>{var n,r;return(r=(n=a.current).dayHeaderDidMount)==null?void 0:r.call(n,e)},slotLabelDidMount:e=>{var n,r;return(r=(n=a.current).slotLabelDidMount)==null?void 0:r.call(n,e)}}},S=h.mount(i,m);g.current=S;const u=S.api,y=()=>{const e=u.getViewModel();return M(e.spec,e.range,e.title)},z=[u.on("eventClick",({event:e,el:n})=>{var r,s;return(s=(r=a.current).eventClick)==null?void 0:s.call(r,{event:f(e),el:n??null,view:y()})}),u.on("dateClick",({date:e,allDay:n})=>{var r,s;return(s=(r=a.current).dateClick)==null?void 0:s.call(r,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allDay:n??!1,view:y()})}),u.on("select",({start:e,end:n})=>{var r,s;return(s=(r=a.current).select)==null?void 0:s.call(r,{start:o.dl.toDate(e),end:o.dl.toDate(n),startStr:o.dl.toISOString(e),endStr:o.dl.toISOString(n),view:y()})}),u.on("unselect",()=>{var e,n;return(n=(e=a.current).unselect)==null?void 0:n.call(e)}),u.on("datesSet",({range:e,view:n})=>{var r,s;return(s=(r=a.current).datesSet)==null?void 0:s.call(r,{start:o.dl.toDate(e.activeStart),end:o.dl.toDate(e.activeEnd),startStr:o.dl.toISOString(e.activeStart),endStr:o.dl.toISOString(e.activeEnd),view:M(n,e)})}),u.on("eventsSet",e=>{var n,r;return(r=(n=a.current).eventsSet)==null?void 0:r.call(n,e.map(s=>f(s)))}),u.on("eventDrop",({event:e})=>{var n,r;return(r=(n=a.current).eventDrop)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventResize",({event:e})=>{var n,r;return(r=(n=a.current).eventResize)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventChange",({event:e})=>{var n,r;return(r=(n=a.current).eventChange)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("moreLinkClick",({date:e,allEvents:n,hiddenEvents:r})=>{var s,N;return(N=(s=a.current).moreLinkClick)==null?void 0:N.call(s,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allEvents:n.map(E=>f(E)),hiddenEvents:r.map(E=>f(E)),view:y()})}),u.on("navLinkDay",({date:e})=>{var n,r;return(r=(n=a.current).navLinkDay)==null?void 0:r.call(n,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e)})}),u.on("loading",({isLoading:e})=>{var n,r;return(r=(n=a.current).loading)==null?void 0:r.call(n,e)})];return(x=(j=a.current).onReady)==null||x.call(j,u),()=>{P.current=!1;for(const e of z)e();S.destroy(),g.current=null,b.current.clear()}},[H]),c.useImperativeHandle(v,()=>({getApi:()=>{var i;return((i=g.current)==null?void 0:i.api)??null}}),[]);const L=V.map(i=>l[i]);c.useEffect(()=>{var S;const i=(S=g.current)==null?void 0:S.api;if(!i)return;const d={};let m=!1;V.forEach((u,y)=>{B(i,u)!==L[y]&&(d[u]=L[y],m=!0)}),m&&i.setOptions(d)},L);const k=l.events,T=c.useRef(k);c.useEffect(()=>{var d;const i=(d=g.current)==null?void 0:d.api;if(!(!i||!k)){if(T.current===k){T.current=void 0;return}i.refetchEvents(k)}},[k]);const I=[];for(const[i,{el:d,payload:m}]of b.current){const S=Y(l,m);S!=null&&I.push(G.createPortal(S,d,i))}return R.jsxs(R.Fragment,{children:[R.jsx("div",{ref:C,className:l.className,style:l.style}),I]})});function Y(t,l){var v,C,g,a,b;switch(l.slot){case"eventContent":return(v=t.eventContent)==null?void 0:v.call(t,q(l.arg));case"dayCellContent":return(C=t.dayCellContent)==null?void 0:C.call(t,l.arg);case"dayHeaderContent":return(g=t.dayHeaderContent)==null?void 0:g.call(t,l.arg);case"slotLabelContent":return(a=t.slotLabelContent)==null?void 0:a.call(t,l.arg);case"moreLinkContent":{const D=l.arg;return(b=t.moreLinkContent)==null?void 0:b.call(t,{date:D.date,moreCount:D.moreCount,allEvents:D.allEvents.map(f),hiddenEvents:D.hiddenEvents.map(f),view:D.view})}default:return null}}function q(t){return{event:f(t.event),isAllDay:t.isAllDay,timeText:t.timeText,view:t.view}}const K=new Set([..._,"eventClick","dateClick","select","unselect","datesSet","eventsSet","eventDrop","eventResize","eventChange","moreLinkClick","navLinkDay","loading","eventDidMount","dayCellDidMount","dayHeaderDidMount","slotLabelDidMount","onReady","className","style"]);function Z(t){const l={};for(const[v,C]of Object.entries(t))K.has(v)||(l[v]=C);return l}Object.defineProperty(exports,"dayGridPlugin",{enumerable:!0,get:()=>o.dayGridPlugin});Object.defineProperty(exports,"definePlugin",{enumerable:!0,get:()=>o.definePlugin});Object.defineProperty(exports,"defineTheme",{enumerable:!0,get:()=>o.defineTheme});Object.defineProperty(exports,"dl",{enumerable:!0,get:()=>o.dl});Object.defineProperty(exports,"listPlugin",{enumerable:!0,get:()=>o.listPlugin});Object.defineProperty(exports,"multiMonthPlugin",{enumerable:!0,get:()=>o.multiMonthPlugin});Object.defineProperty(exports,"resourcePlugin",{enumerable:!0,get:()=>o.resourcePlugin});Object.defineProperty(exports,"timeGridPlugin",{enumerable:!0,get:()=>o.timeGridPlugin});Object.defineProperty(exports,"timelinePlugin",{enumerable:!0,get:()=>o.timelinePlugin});exports.ReserviCalendar=W;exports.adaptEvent=f;exports.adaptView=M;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),c=require("react"),G=require("react-dom"),h=require("@reservi/preact"),o=require("@reservi/core"),F=t=>t?o.dl.toDate(t):null,A=t=>t?o.dl.toISOString(t):"";function f(t){return{id:t.id,groupId:t.groupId,title:t.title,start:F(t.start),end:F(t.end),startStr:A(t.start),endStr:A(t.end),allDay:t.allDay,url:t.url,display:t.display,backgroundColor:t.backgroundColor,borderColor:t.borderColor,textColor:t.textColor,classNames:t.classNames,extendedProps:t.extendedProps,def:t}}function M(t,l,v){const m={type:t.type};return l?{...m,...v==null?{}:{title:v},currentStart:o.dl.toDate(l.currentStart),currentEnd:o.dl.toDate(l.currentEnd),activeStart:o.dl.toDate(l.activeStart),activeEnd:o.dl.toDate(l.activeEnd)}:v==null?m:{...m,title:v}}const _=["eventContent","dayCellContent","dayHeaderContent","slotLabelContent","moreLinkContent"],V=["locale","direction","timeZone","firstDay","weekends","hiddenDays","fixedWeekCount","showNonCurrentDates","weekNumbers","weekNumberCalculation","navLinks","dayHeaders","dayNumberAlign","moreLinkPopover","dayMaxEvents","dayMaxEventRows","slotMinTime","slotMaxTime","slotDuration","slotLabelInterval","allDaySlot","nowIndicator","scrollTime","editable","eventDraggable","selectable","selectMirror","snapDuration","businessHours","eventOverlap","eventConstraint","eventAllow","theme","themeTokens","headerToolbar","hourHeight","height","eventTimeFormat","slotLabelFormat","dayHeaderFormat","listDayFormat","listDaySideFormat","titleFormat","viewOverrides","keyboardShortcuts","resourceAreaWidth","resourceOrder","lazyFetching","classNames","views","addButtonText","responsiveViews"];function B(t,l){return t.getOption(l)}const W=c.forwardRef(function(l,v){const m=c.useRef(null),g=c.useRef(null),a=c.useRef(l);a.current=l;const b=c.useRef(new Map),[,D]=c.useState(0),O=c.useRef(!1),P=c.useRef(!0),w=c.useCallback(()=>{O.current||(O.current=!0,queueMicrotask(()=>{O.current=!1,P.current&&D(i=>i+1)}))},[]),H=c.useMemo(()=>({mount(i,d,C){b.current.set(i,{el:d,payload:C}),w()},update(i,d){const C=b.current.get(i);C&&(C.payload=d,w())},unmount(i){b.current.delete(i)&&w()}}),[w]);c.useEffect(()=>{var j,x;const i=m.current;if(!i)return;P.current=!0;const d={eventContent:e=>a.current.eventContent?h.hostSlot({slot:"eventContent",arg:e}):void 0,dayCellContent:e=>a.current.dayCellContent?h.hostSlot({slot:"dayCellContent",arg:e}):void 0,dayHeaderContent:e=>a.current.dayHeaderContent?h.hostSlot({slot:"dayHeaderContent",arg:e}):void 0,slotLabelContent:e=>a.current.slotLabelContent?h.hostSlot({slot:"slotLabelContent",arg:e}):void 0,moreLinkContent:e=>a.current.moreLinkContent?h.hostSlot({slot:"moreLinkContent",arg:e}):void 0},C={...Z(a.current),slots:d,hostBridge:H,hooks:{eventDidMount:e=>{const n=a.current.eventDidMount;n&&n({...q(e),el:e.el})},dayCellDidMount:e=>{var n,r;return(r=(n=a.current).dayCellDidMount)==null?void 0:r.call(n,e)},dayHeaderDidMount:e=>{var n,r;return(r=(n=a.current).dayHeaderDidMount)==null?void 0:r.call(n,e)},slotLabelDidMount:e=>{var n,r;return(r=(n=a.current).slotLabelDidMount)==null?void 0:r.call(n,e)}}},S=h.mount(i,C);g.current=S;const u=S.api,y=()=>{const e=u.getViewModel();return M(e.spec,e.range,e.title)},z=[u.on("eventClick",({event:e,el:n})=>{var r,s;return(s=(r=a.current).eventClick)==null?void 0:s.call(r,{event:f(e),el:n??null,view:y()})}),u.on("dateClick",({date:e,allDay:n})=>{var r,s;return(s=(r=a.current).dateClick)==null?void 0:s.call(r,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allDay:n??!1,view:y()})}),u.on("select",({start:e,end:n})=>{var r,s;return(s=(r=a.current).select)==null?void 0:s.call(r,{start:o.dl.toDate(e),end:o.dl.toDate(n),startStr:o.dl.toISOString(e),endStr:o.dl.toISOString(n),view:y()})}),u.on("unselect",()=>{var e,n;return(n=(e=a.current).unselect)==null?void 0:n.call(e)}),u.on("datesSet",({range:e,view:n})=>{var r,s;return(s=(r=a.current).datesSet)==null?void 0:s.call(r,{start:o.dl.toDate(e.activeStart),end:o.dl.toDate(e.activeEnd),startStr:o.dl.toISOString(e.activeStart),endStr:o.dl.toISOString(e.activeEnd),view:M(n,e)})}),u.on("eventsSet",e=>{var n,r;return(r=(n=a.current).eventsSet)==null?void 0:r.call(n,e.map(s=>f(s)))}),u.on("eventDrop",({event:e})=>{var n,r;return(r=(n=a.current).eventDrop)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventResize",({event:e})=>{var n,r;return(r=(n=a.current).eventResize)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventChange",({event:e})=>{var n,r;return(r=(n=a.current).eventChange)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("moreLinkClick",({date:e,allEvents:n,hiddenEvents:r})=>{var s,N;return(N=(s=a.current).moreLinkClick)==null?void 0:N.call(s,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allEvents:n.map(E=>f(E)),hiddenEvents:r.map(E=>f(E)),view:y()})}),u.on("navLinkDay",({date:e})=>{var n,r;return(r=(n=a.current).navLinkDay)==null?void 0:r.call(n,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e)})}),u.on("loading",({isLoading:e})=>{var n,r;return(r=(n=a.current).loading)==null?void 0:r.call(n,e)})];return(x=(j=a.current).onReady)==null||x.call(j,u),()=>{P.current=!1;for(const e of z)e();S.destroy(),g.current=null,b.current.clear()}},[H]),c.useImperativeHandle(v,()=>({getApi:()=>{var i;return((i=g.current)==null?void 0:i.api)??null}}),[]);const L=V.map(i=>l[i]);c.useEffect(()=>{var S;const i=(S=g.current)==null?void 0:S.api;if(!i)return;const d={};let C=!1;V.forEach((u,y)=>{B(i,u)!==L[y]&&(d[u]=L[y],C=!0)}),C&&i.setOptions(d)},L);const k=l.events,T=c.useRef(k);c.useEffect(()=>{var d;const i=(d=g.current)==null?void 0:d.api;if(!(!i||!k)){if(T.current===k){T.current=void 0;return}i.refetchEvents(k)}},[k]);const I=[];for(const[i,{el:d,payload:C}]of b.current){const S=Y(l,C);S!=null&&I.push(G.createPortal(S,d,i))}return R.jsxs(R.Fragment,{children:[R.jsx("div",{ref:m,className:l.className,style:l.style}),I]})});function Y(t,l){var v,m,g,a,b;switch(l.slot){case"eventContent":return(v=t.eventContent)==null?void 0:v.call(t,q(l.arg));case"dayCellContent":return(m=t.dayCellContent)==null?void 0:m.call(t,l.arg);case"dayHeaderContent":return(g=t.dayHeaderContent)==null?void 0:g.call(t,l.arg);case"slotLabelContent":return(a=t.slotLabelContent)==null?void 0:a.call(t,l.arg);case"moreLinkContent":{const D=l.arg;return(b=t.moreLinkContent)==null?void 0:b.call(t,{date:D.date,moreCount:D.moreCount,allEvents:D.allEvents.map(f),hiddenEvents:D.hiddenEvents.map(f),view:D.view})}default:return null}}function q(t){return{event:f(t.event),isAllDay:t.isAllDay,timeText:t.timeText,view:t.view}}const K=new Set([..._,"eventClick","dateClick","select","unselect","datesSet","eventsSet","eventDrop","eventResize","eventChange","moreLinkClick","navLinkDay","loading","eventDidMount","dayCellDidMount","dayHeaderDidMount","slotLabelDidMount","onReady","className","style"]);function Z(t){const l={};for(const[v,m]of Object.entries(t))K.has(v)||(l[v]=m);return l}Object.defineProperty(exports,"dayGridPlugin",{enumerable:!0,get:()=>o.dayGridPlugin});Object.defineProperty(exports,"definePlugin",{enumerable:!0,get:()=>o.definePlugin});Object.defineProperty(exports,"defineTheme",{enumerable:!0,get:()=>o.defineTheme});Object.defineProperty(exports,"dl",{enumerable:!0,get:()=>o.dl});Object.defineProperty(exports,"listPlugin",{enumerable:!0,get:()=>o.listPlugin});Object.defineProperty(exports,"multiMonthPlugin",{enumerable:!0,get:()=>o.multiMonthPlugin});Object.defineProperty(exports,"resourcePlugin",{enumerable:!0,get:()=>o.resourcePlugin});Object.defineProperty(exports,"timeGridPlugin",{enumerable:!0,get:()=>o.timeGridPlugin});Object.defineProperty(exports,"timelinePlugin",{enumerable:!0,get:()=>o.timelinePlugin});exports.ReserviCalendar=W;exports.adaptEvent=f;exports.adaptView=M;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayHeaders\",\n \"dayNumberAlign\",\n \"moreLinkPopover\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,10 +2,10 @@ import { jsxs as B, Fragment as G, jsx as W } from "react/jsx-runtime";
2
2
  import { forwardRef as Y, useRef as g, useState as q, useCallback as K, useMemo as Z, useEffect as R, useImperativeHandle as J } from "react";
3
3
  import { createPortal as Q } from "react-dom";
4
4
  import { mount as U, hostSlot as w } from "@reservi/preact";
5
- import { dl as i } from "@reservi/core";
6
- import { dayGridPlugin as ce, definePlugin as de, defineTheme as ve, dl as Ce, listPlugin as me, multiMonthPlugin as Se, resourcePlugin as fe, timeGridPlugin as ye, timelinePlugin as De } from "@reservi/core";
7
- const F = (t) => t ? i.toDate(t) : null, A = (t) => t ? i.toISOString(t) : "";
8
- function S(t) {
5
+ import { dl as l } from "@reservi/core";
6
+ import { dayGridPlugin as ce, definePlugin as de, defineTheme as ve, dl as Ce, listPlugin as me, multiMonthPlugin as ye, resourcePlugin as Se, timeGridPlugin as fe, timelinePlugin as De } from "@reservi/core";
7
+ const F = (t) => t ? l.toDate(t) : null, A = (t) => t ? l.toISOString(t) : "";
8
+ function y(t) {
9
9
  return {
10
10
  id: t.id,
11
11
  groupId: t.groupId,
@@ -30,10 +30,10 @@ function V(t, a, d) {
30
30
  return a ? {
31
31
  ...v,
32
32
  ...d == null ? {} : { title: d },
33
- currentStart: i.toDate(a.currentStart),
34
- currentEnd: i.toDate(a.currentEnd),
35
- activeStart: i.toDate(a.activeStart),
36
- activeEnd: i.toDate(a.activeEnd)
33
+ currentStart: l.toDate(a.currentStart),
34
+ currentEnd: l.toDate(a.currentEnd),
35
+ activeStart: l.toDate(a.activeStart),
36
+ activeEnd: l.toDate(a.activeEnd)
37
37
  } : d == null ? v : { ...v, title: d };
38
38
  }
39
39
  const X = [
@@ -54,6 +54,9 @@ const X = [
54
54
  "weekNumbers",
55
55
  "weekNumberCalculation",
56
56
  "navLinks",
57
+ "dayHeaders",
58
+ "dayNumberAlign",
59
+ "moreLinkPopover",
57
60
  "dayMaxEvents",
58
61
  "dayMaxEventRows",
59
62
  "slotMinTime",
@@ -99,33 +102,33 @@ const X = [
99
102
  function $(t, a) {
100
103
  return t.getOption(a);
101
104
  }
102
- const ie = Y(
105
+ const le = Y(
103
106
  function(a, d) {
104
- const v = g(null), y = g(null), o = g(a);
107
+ const v = g(null), f = g(null), o = g(a);
105
108
  o.current = a;
106
109
  const D = g(/* @__PURE__ */ new Map()), [, h] = q(0), L = g(!1), E = g(!0), b = K(() => {
107
110
  L.current || (L.current = !0, queueMicrotask(() => {
108
- L.current = !1, E.current && h((l) => l + 1);
111
+ L.current = !1, E.current && h((i) => i + 1);
109
112
  }));
110
113
  }, []), H = Z(
111
114
  () => ({
112
- mount(l, c, C) {
113
- D.current.set(l, { el: c, payload: C }), b();
115
+ mount(i, c, C) {
116
+ D.current.set(i, { el: c, payload: C }), b();
114
117
  },
115
- update(l, c) {
116
- const C = D.current.get(l);
118
+ update(i, c) {
119
+ const C = D.current.get(i);
117
120
  C && (C.payload = c, b());
118
121
  },
119
- unmount(l) {
120
- D.current.delete(l) && b();
122
+ unmount(i) {
123
+ D.current.delete(i) && b();
121
124
  }
122
125
  }),
123
126
  [b]
124
127
  );
125
128
  R(() => {
126
- var T, P;
127
- const l = v.current;
128
- if (!l) return;
129
+ var P, T;
130
+ const i = v.current;
131
+ if (!i) return;
129
132
  E.current = !0;
130
133
  const c = {
131
134
  eventContent: (e) => o.current.eventContent ? w({ slot: "eventContent", arg: e }) : void 0,
@@ -155,9 +158,9 @@ const ie = Y(
155
158
  return (r = (n = o.current).slotLabelDidMount) == null ? void 0 : r.call(n, e);
156
159
  }
157
160
  }
158
- }, f = U(l, C);
159
- y.current = f;
160
- const s = f.api, m = () => {
161
+ }, S = U(i, C);
162
+ f.current = S;
163
+ const s = S.api, m = () => {
161
164
  const e = s.getViewModel();
162
165
  return V(e.spec, e.range, e.title);
163
166
  }, j = [
@@ -166,7 +169,7 @@ const ie = Y(
166
169
  ({ event: e, el: n }) => {
167
170
  var r, u;
168
171
  return (u = (r = o.current).eventClick) == null ? void 0 : u.call(r, {
169
- event: S(e),
172
+ event: y(e),
170
173
  el: n ?? null,
171
174
  view: m()
172
175
  });
@@ -177,8 +180,8 @@ const ie = Y(
177
180
  ({ date: e, allDay: n }) => {
178
181
  var r, u;
179
182
  return (u = (r = o.current).dateClick) == null ? void 0 : u.call(r, {
180
- date: i.toDate(e),
181
- dateStr: i.toISOString(e),
183
+ date: l.toDate(e),
184
+ dateStr: l.toISOString(e),
182
185
  allDay: n ?? !1,
183
186
  view: m()
184
187
  });
@@ -189,10 +192,10 @@ const ie = Y(
189
192
  ({ start: e, end: n }) => {
190
193
  var r, u;
191
194
  return (u = (r = o.current).select) == null ? void 0 : u.call(r, {
192
- start: i.toDate(e),
193
- end: i.toDate(n),
194
- startStr: i.toISOString(e),
195
- endStr: i.toISOString(n),
195
+ start: l.toDate(e),
196
+ end: l.toDate(n),
197
+ startStr: l.toISOString(e),
198
+ endStr: l.toISOString(n),
196
199
  view: m()
197
200
  });
198
201
  }
@@ -206,10 +209,10 @@ const ie = Y(
206
209
  ({ range: e, view: n }) => {
207
210
  var r, u;
208
211
  return (u = (r = o.current).datesSet) == null ? void 0 : u.call(r, {
209
- start: i.toDate(e.activeStart),
210
- end: i.toDate(e.activeEnd),
211
- startStr: i.toISOString(e.activeStart),
212
- endStr: i.toISOString(e.activeEnd),
212
+ start: l.toDate(e.activeStart),
213
+ end: l.toDate(e.activeEnd),
214
+ startStr: l.toISOString(e.activeStart),
215
+ endStr: l.toISOString(e.activeEnd),
213
216
  view: V(n, e)
214
217
  });
215
218
  }
@@ -220,28 +223,28 @@ const ie = Y(
220
223
  "eventsSet",
221
224
  (e) => {
222
225
  var n, r;
223
- return (r = (n = o.current).eventsSet) == null ? void 0 : r.call(n, e.map((u) => S(u)));
226
+ return (r = (n = o.current).eventsSet) == null ? void 0 : r.call(n, e.map((u) => y(u)));
224
227
  }
225
228
  ),
226
229
  s.on(
227
230
  "eventDrop",
228
231
  ({ event: e }) => {
229
232
  var n, r;
230
- return (r = (n = o.current).eventDrop) == null ? void 0 : r.call(n, { event: S(e), view: m() });
233
+ return (r = (n = o.current).eventDrop) == null ? void 0 : r.call(n, { event: y(e), view: m() });
231
234
  }
232
235
  ),
233
236
  s.on(
234
237
  "eventResize",
235
238
  ({ event: e }) => {
236
239
  var n, r;
237
- return (r = (n = o.current).eventResize) == null ? void 0 : r.call(n, { event: S(e), view: m() });
240
+ return (r = (n = o.current).eventResize) == null ? void 0 : r.call(n, { event: y(e), view: m() });
238
241
  }
239
242
  ),
240
243
  s.on(
241
244
  "eventChange",
242
245
  ({ event: e }) => {
243
246
  var n, r;
244
- return (r = (n = o.current).eventChange) == null ? void 0 : r.call(n, { event: S(e), view: m() });
247
+ return (r = (n = o.current).eventChange) == null ? void 0 : r.call(n, { event: y(e), view: m() });
245
248
  }
246
249
  ),
247
250
  s.on(
@@ -249,10 +252,10 @@ const ie = Y(
249
252
  ({ date: e, allEvents: n, hiddenEvents: r }) => {
250
253
  var u, N;
251
254
  return (N = (u = o.current).moreLinkClick) == null ? void 0 : N.call(u, {
252
- date: i.toDate(e),
253
- dateStr: i.toISOString(e),
254
- allEvents: n.map((O) => S(O)),
255
- hiddenEvents: r.map((O) => S(O)),
255
+ date: l.toDate(e),
256
+ dateStr: l.toISOString(e),
257
+ allEvents: n.map((O) => y(O)),
258
+ hiddenEvents: r.map((O) => y(O)),
256
259
  view: m()
257
260
  });
258
261
  }
@@ -261,7 +264,7 @@ const ie = Y(
261
264
  "navLinkDay",
262
265
  ({ date: e }) => {
263
266
  var n, r;
264
- return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: i.toDate(e), dateStr: i.toISOString(e) });
267
+ return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: l.toDate(e), dateStr: l.toISOString(e) });
265
268
  }
266
269
  ),
267
270
  s.on("loading", ({ isLoading: e }) => {
@@ -269,42 +272,42 @@ const ie = Y(
269
272
  return (r = (n = o.current).loading) == null ? void 0 : r.call(n, e);
270
273
  })
271
274
  ];
272
- return (P = (T = o.current).onReady) == null || P.call(T, s), () => {
275
+ return (T = (P = o.current).onReady) == null || T.call(P, s), () => {
273
276
  E.current = !1;
274
277
  for (const e of j) e();
275
- f.destroy(), y.current = null, D.current.clear();
278
+ S.destroy(), f.current = null, D.current.clear();
276
279
  };
277
280
  }, [H]), J(d, () => ({ getApi: () => {
278
- var l;
279
- return ((l = y.current) == null ? void 0 : l.api) ?? null;
281
+ var i;
282
+ return ((i = f.current) == null ? void 0 : i.api) ?? null;
280
283
  } }), []);
281
- const M = z.map((l) => a[l]);
284
+ const M = z.map((i) => a[i]);
282
285
  R(() => {
283
- var f;
284
- const l = (f = y.current) == null ? void 0 : f.api;
285
- if (!l) return;
286
+ var S;
287
+ const i = (S = f.current) == null ? void 0 : S.api;
288
+ if (!i) return;
286
289
  const c = {};
287
290
  let C = !1;
288
291
  z.forEach((s, m) => {
289
- $(l, s) !== M[m] && (c[s] = M[m], C = !0);
290
- }), C && l.setOptions(c);
292
+ $(i, s) !== M[m] && (c[s] = M[m], C = !0);
293
+ }), C && i.setOptions(c);
291
294
  }, M);
292
295
  const k = a.events, x = g(k);
293
296
  R(() => {
294
297
  var c;
295
- const l = (c = y.current) == null ? void 0 : c.api;
296
- if (!(!l || !k)) {
298
+ const i = (c = f.current) == null ? void 0 : c.api;
299
+ if (!(!i || !k)) {
297
300
  if (x.current === k) {
298
301
  x.current = void 0;
299
302
  return;
300
303
  }
301
- l.refetchEvents(k);
304
+ i.refetchEvents(k);
302
305
  }
303
306
  }, [k]);
304
307
  const I = [];
305
- for (const [l, { el: c, payload: C }] of D.current) {
306
- const f = p(a, C);
307
- f != null && I.push(Q(f, c, l));
308
+ for (const [i, { el: c, payload: C }] of D.current) {
309
+ const S = p(a, C);
310
+ S != null && I.push(Q(S, c, i));
308
311
  }
309
312
  return /* @__PURE__ */ B(G, { children: [
310
313
  /* @__PURE__ */ W("div", { ref: v, className: a.className, style: a.style }),
@@ -313,14 +316,14 @@ const ie = Y(
313
316
  }
314
317
  );
315
318
  function p(t, a) {
316
- var d, v, y, o, D;
319
+ var d, v, f, o, D;
317
320
  switch (a.slot) {
318
321
  case "eventContent":
319
322
  return (d = t.eventContent) == null ? void 0 : d.call(t, _(a.arg));
320
323
  case "dayCellContent":
321
324
  return (v = t.dayCellContent) == null ? void 0 : v.call(t, a.arg);
322
325
  case "dayHeaderContent":
323
- return (y = t.dayHeaderContent) == null ? void 0 : y.call(t, a.arg);
326
+ return (f = t.dayHeaderContent) == null ? void 0 : f.call(t, a.arg);
324
327
  case "slotLabelContent":
325
328
  return (o = t.slotLabelContent) == null ? void 0 : o.call(t, a.arg);
326
329
  case "moreLinkContent": {
@@ -328,8 +331,8 @@ function p(t, a) {
328
331
  return (D = t.moreLinkContent) == null ? void 0 : D.call(t, {
329
332
  date: h.date,
330
333
  moreCount: h.moreCount,
331
- allEvents: h.allEvents.map(S),
332
- hiddenEvents: h.hiddenEvents.map(S),
334
+ allEvents: h.allEvents.map(y),
335
+ hiddenEvents: h.hiddenEvents.map(y),
333
336
  view: h.view
334
337
  });
335
338
  }
@@ -339,7 +342,7 @@ function p(t, a) {
339
342
  }
340
343
  function _(t) {
341
344
  return {
342
- event: S(t.event),
345
+ event: y(t.event),
343
346
  isAllDay: t.isAllDay,
344
347
  timeText: t.timeText,
345
348
  view: t.view
@@ -374,17 +377,17 @@ function te(t) {
374
377
  return a;
375
378
  }
376
379
  export {
377
- ie as ReserviCalendar,
378
- S as adaptEvent,
380
+ le as ReserviCalendar,
381
+ y as adaptEvent,
379
382
  V as adaptView,
380
383
  ce as dayGridPlugin,
381
384
  de as definePlugin,
382
385
  ve as defineTheme,
383
386
  Ce as dl,
384
387
  me as listPlugin,
385
- Se as multiMonthPlugin,
386
- fe as resourcePlugin,
387
- ye as timeGridPlugin,
388
+ ye as multiMonthPlugin,
389
+ Se as resourcePlugin,
390
+ fe as timeGridPlugin,
388
391
  De as timelinePlugin
389
392
  };
390
393
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayHeaders\",\n \"dayNumberAlign\",\n \"moreLinkPopover\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reservi/react",
3
- "version": "2.0.0-beta.3",
3
+ "version": "2.0.0-beta.4",
4
4
  "description": "Wrapper de React para Reservi Calendar.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,8 +36,8 @@
36
36
  }
37
37
  },
38
38
  "dependencies": {
39
- "@reservi/core": "2.0.0-beta.3",
40
- "@reservi/preact": "2.0.0-beta.3"
39
+ "@reservi/preact": "2.0.0-beta.4",
40
+ "@reservi/core": "2.0.0-beta.4"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "react": "^18.0.0 || ^19.0.0",