@reservi/react 1.4.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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,a,v){const C={type:t.type};return a?{...C,...v==null?{}:{title:v},currentStart:o.dl.toDate(a.currentStart),currentEnd:o.dl.toDate(a.currentEnd),activeStart:o.dl.toDate(a.activeStart),activeEnd:o.dl.toDate(a.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","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,a){return t.getOption(a)}const W=c.forwardRef(function(a,v){const C=c.useRef(null),g=c.useRef(null),l=c.useRef(a);l.current=a;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=>l.current.eventContent?h.hostSlot({slot:"eventContent",arg:e}):void 0,dayCellContent:e=>l.current.dayCellContent?h.hostSlot({slot:"dayCellContent",arg:e}):void 0,dayHeaderContent:e=>l.current.dayHeaderContent?h.hostSlot({slot:"dayHeaderContent",arg:e}):void 0,slotLabelContent:e=>l.current.slotLabelContent?h.hostSlot({slot:"slotLabelContent",arg:e}):void 0,moreLinkContent:e=>l.current.moreLinkContent?h.hostSlot({slot:"moreLinkContent",arg:e}):void 0},m={...Z(l.current),slots:d,hostBridge:H,hooks:{eventDidMount:e=>{const n=l.current.eventDidMount;n&&n({...q(e),el:e.el})},dayCellDidMount:e=>{var n,r;return(r=(n=l.current).dayCellDidMount)==null?void 0:r.call(n,e)},dayHeaderDidMount:e=>{var n,r;return(r=(n=l.current).dayHeaderDidMount)==null?void 0:r.call(n,e)},slotLabelDidMount:e=>{var n,r;return(r=(n=l.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=l.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=l.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=l.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=l.current).unselect)==null?void 0:n.call(e)}),u.on("datesSet",({range:e,view:n})=>{var r,s;return(s=(r=l.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=l.current).eventsSet)==null?void 0:r.call(n,e.map(s=>f(s)))}),u.on("eventDrop",({event:e})=>{var n,r;return(r=(n=l.current).eventDrop)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventResize",({event:e})=>{var n,r;return(r=(n=l.current).eventResize)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventChange",({event:e})=>{var n,r;return(r=(n=l.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=l.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=l.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=l.current).loading)==null?void 0:r.call(n,e)})];return(x=(j=l.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=>a[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=a.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(a,m);S!=null&&I.push(G.createPortal(S,d,i))}return R.jsxs(R.Fragment,{children:[R.jsx("div",{ref:C,className:a.className,style:a.style}),I]})});function Y(t,a){var v,C,g,l,b;switch(a.slot){case"eventContent":return(v=t.eventContent)==null?void 0:v.call(t,q(a.arg));case"dayCellContent":return(C=t.dayCellContent)==null?void 0:C.call(t,a.arg);case"dayHeaderContent":return(g=t.dayHeaderContent)==null?void 0:g.call(t,a.arg);case"slotLabelContent":return(l=t.slotLabelContent)==null?void 0:l.call(t,a.arg);case"moreLinkContent":{const D=a.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 a={};for(const[v,C]of Object.entries(t))K.has(v)||(a[v]=C);return a}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 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;
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 \"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 \"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,9 +2,9 @@ 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 l } from "@reservi/core";
5
+ import { dl as i } from "@reservi/core";
6
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 ? l.toDate(t) : null, A = (t) => t ? l.toISOString(t) : "";
7
+ const F = (t) => t ? i.toDate(t) : null, A = (t) => t ? i.toISOString(t) : "";
8
8
  function S(t) {
9
9
  return {
10
10
  id: t.id,
@@ -30,10 +30,10 @@ function V(t, a, d) {
30
30
  return a ? {
31
31
  ...v,
32
32
  ...d == null ? {} : { title: d },
33
- currentStart: l.toDate(a.currentStart),
34
- currentEnd: l.toDate(a.currentEnd),
35
- activeStart: l.toDate(a.activeStart),
36
- activeEnd: l.toDate(a.activeEnd)
33
+ currentStart: i.toDate(a.currentStart),
34
+ currentEnd: i.toDate(a.currentEnd),
35
+ activeStart: i.toDate(a.activeStart),
36
+ activeEnd: i.toDate(a.activeEnd)
37
37
  } : d == null ? v : { ...v, title: d };
38
38
  }
39
39
  const X = [
@@ -64,6 +64,7 @@ const X = [
64
64
  "nowIndicator",
65
65
  "scrollTime",
66
66
  "editable",
67
+ "eventDraggable",
67
68
  "selectable",
68
69
  "selectMirror",
69
70
  "snapDuration",
@@ -98,33 +99,33 @@ const X = [
98
99
  function $(t, a) {
99
100
  return t.getOption(a);
100
101
  }
101
- const le = Y(
102
+ const ie = Y(
102
103
  function(a, d) {
103
104
  const v = g(null), y = g(null), o = g(a);
104
105
  o.current = a;
105
106
  const D = g(/* @__PURE__ */ new Map()), [, h] = q(0), L = g(!1), E = g(!0), b = K(() => {
106
107
  L.current || (L.current = !0, queueMicrotask(() => {
107
- L.current = !1, E.current && h((i) => i + 1);
108
+ L.current = !1, E.current && h((l) => l + 1);
108
109
  }));
109
110
  }, []), H = Z(
110
111
  () => ({
111
- mount(i, c, C) {
112
- D.current.set(i, { el: c, payload: C }), b();
112
+ mount(l, c, C) {
113
+ D.current.set(l, { el: c, payload: C }), b();
113
114
  },
114
- update(i, c) {
115
- const C = D.current.get(i);
115
+ update(l, c) {
116
+ const C = D.current.get(l);
116
117
  C && (C.payload = c, b());
117
118
  },
118
- unmount(i) {
119
- D.current.delete(i) && b();
119
+ unmount(l) {
120
+ D.current.delete(l) && b();
120
121
  }
121
122
  }),
122
123
  [b]
123
124
  );
124
125
  R(() => {
125
126
  var T, P;
126
- const i = v.current;
127
- if (!i) return;
127
+ const l = v.current;
128
+ if (!l) return;
128
129
  E.current = !0;
129
130
  const c = {
130
131
  eventContent: (e) => o.current.eventContent ? w({ slot: "eventContent", arg: e }) : void 0,
@@ -154,7 +155,7 @@ const le = Y(
154
155
  return (r = (n = o.current).slotLabelDidMount) == null ? void 0 : r.call(n, e);
155
156
  }
156
157
  }
157
- }, f = U(i, C);
158
+ }, f = U(l, C);
158
159
  y.current = f;
159
160
  const s = f.api, m = () => {
160
161
  const e = s.getViewModel();
@@ -176,8 +177,8 @@ const le = Y(
176
177
  ({ date: e, allDay: n }) => {
177
178
  var r, u;
178
179
  return (u = (r = o.current).dateClick) == null ? void 0 : u.call(r, {
179
- date: l.toDate(e),
180
- dateStr: l.toISOString(e),
180
+ date: i.toDate(e),
181
+ dateStr: i.toISOString(e),
181
182
  allDay: n ?? !1,
182
183
  view: m()
183
184
  });
@@ -188,10 +189,10 @@ const le = Y(
188
189
  ({ start: e, end: n }) => {
189
190
  var r, u;
190
191
  return (u = (r = o.current).select) == null ? void 0 : u.call(r, {
191
- start: l.toDate(e),
192
- end: l.toDate(n),
193
- startStr: l.toISOString(e),
194
- endStr: l.toISOString(n),
192
+ start: i.toDate(e),
193
+ end: i.toDate(n),
194
+ startStr: i.toISOString(e),
195
+ endStr: i.toISOString(n),
195
196
  view: m()
196
197
  });
197
198
  }
@@ -205,10 +206,10 @@ const le = Y(
205
206
  ({ range: e, view: n }) => {
206
207
  var r, u;
207
208
  return (u = (r = o.current).datesSet) == null ? void 0 : u.call(r, {
208
- start: l.toDate(e.activeStart),
209
- end: l.toDate(e.activeEnd),
210
- startStr: l.toISOString(e.activeStart),
211
- endStr: l.toISOString(e.activeEnd),
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
213
  view: V(n, e)
213
214
  });
214
215
  }
@@ -248,8 +249,8 @@ const le = Y(
248
249
  ({ date: e, allEvents: n, hiddenEvents: r }) => {
249
250
  var u, N;
250
251
  return (N = (u = o.current).moreLinkClick) == null ? void 0 : N.call(u, {
251
- date: l.toDate(e),
252
- dateStr: l.toISOString(e),
252
+ date: i.toDate(e),
253
+ dateStr: i.toISOString(e),
253
254
  allEvents: n.map((O) => S(O)),
254
255
  hiddenEvents: r.map((O) => S(O)),
255
256
  view: m()
@@ -260,7 +261,7 @@ const le = Y(
260
261
  "navLinkDay",
261
262
  ({ date: e }) => {
262
263
  var n, r;
263
- return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: l.toDate(e), dateStr: l.toISOString(e) });
264
+ return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: i.toDate(e), dateStr: i.toISOString(e) });
264
265
  }
265
266
  ),
266
267
  s.on("loading", ({ isLoading: e }) => {
@@ -274,36 +275,36 @@ const le = Y(
274
275
  f.destroy(), y.current = null, D.current.clear();
275
276
  };
276
277
  }, [H]), J(d, () => ({ getApi: () => {
277
- var i;
278
- return ((i = y.current) == null ? void 0 : i.api) ?? null;
278
+ var l;
279
+ return ((l = y.current) == null ? void 0 : l.api) ?? null;
279
280
  } }), []);
280
- const M = z.map((i) => a[i]);
281
+ const M = z.map((l) => a[l]);
281
282
  R(() => {
282
283
  var f;
283
- const i = (f = y.current) == null ? void 0 : f.api;
284
- if (!i) return;
284
+ const l = (f = y.current) == null ? void 0 : f.api;
285
+ if (!l) return;
285
286
  const c = {};
286
287
  let C = !1;
287
288
  z.forEach((s, m) => {
288
- $(i, s) !== M[m] && (c[s] = M[m], C = !0);
289
- }), C && i.setOptions(c);
289
+ $(l, s) !== M[m] && (c[s] = M[m], C = !0);
290
+ }), C && l.setOptions(c);
290
291
  }, M);
291
292
  const k = a.events, x = g(k);
292
293
  R(() => {
293
294
  var c;
294
- const i = (c = y.current) == null ? void 0 : c.api;
295
- if (!(!i || !k)) {
295
+ const l = (c = y.current) == null ? void 0 : c.api;
296
+ if (!(!l || !k)) {
296
297
  if (x.current === k) {
297
298
  x.current = void 0;
298
299
  return;
299
300
  }
300
- i.refetchEvents(k);
301
+ l.refetchEvents(k);
301
302
  }
302
303
  }, [k]);
303
304
  const I = [];
304
- for (const [i, { el: c, payload: C }] of D.current) {
305
+ for (const [l, { el: c, payload: C }] of D.current) {
305
306
  const f = p(a, C);
306
- f != null && I.push(Q(f, c, i));
307
+ f != null && I.push(Q(f, c, l));
307
308
  }
308
309
  return /* @__PURE__ */ B(G, { children: [
309
310
  /* @__PURE__ */ W("div", { ref: v, className: a.className, style: a.style }),
@@ -373,7 +374,7 @@ function te(t) {
373
374
  return a;
374
375
  }
375
376
  export {
376
- le as ReserviCalendar,
377
+ ie as ReserviCalendar,
377
378
  S as adaptEvent,
378
379
  V as adaptView,
379
380
  ce as dayGridPlugin,
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 \"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 \"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": "1.4.1",
3
+ "version": "1.6.0",
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": "1.4.1",
40
- "@reservi/preact": "1.4.1"
39
+ "@reservi/core": "1.6.0",
40
+ "@reservi/preact": "1.6.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "react": "^18.0.0 || ^19.0.0",