@marco.colia/react-fast-scheduler 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@ A lightweight React day scheduler for resource-based booking UIs.
8
8
  - drag and resize interactions
9
9
  - date navigation with a built-in toolbar and date picker
10
10
  - customizable appointment rendering
11
- - a simple adapter layer for your backend data
11
+ - a simple field adapter layer for your backend data
12
12
 
13
13
  ![Scheduler demo](https://res.cloudinary.com/dt74zb1rv/image/upload/v1774457086/Video_del_2026-03-25_17-35-51_kuflee.gif)
14
14
 
@@ -48,7 +48,7 @@ import {
48
48
  Scheduler,
49
49
  applySchedulerAppointmentChange,
50
50
  type BaseSchedulerResource,
51
- type SchedulerAppointmentChangeArgs,
51
+ type SchedulerAppointmentChangeEvent,
52
52
  } from "@marco.colia/react-fast-scheduler";
53
53
  import "@marco.colia/react-fast-scheduler/styles.css";
54
54
 
@@ -103,13 +103,14 @@ export const SchedulerExample = () => {
103
103
  };
104
104
 
105
105
  const handleAppointmentChange = async (
106
- change: SchedulerAppointmentChangeArgs<Appointment, number>
106
+ change: SchedulerAppointmentChangeEvent<Appointment, number>
107
107
  ) => {
108
108
  const optimisticAppointments = applySchedulerAppointmentChange(appointments, change, {
109
- getId: (item) => item.id,
110
- setResourceId: (item, resourceId) => ({ ...item, staffId: resourceId }),
111
- setStart: (item, start) => ({ ...item, start: start.toISOString() }),
112
- setEnd: (item, end) => ({ ...item, end: end.toISOString() }),
109
+ id: "id",
110
+ resourceId: "staffId",
111
+ start: "start",
112
+ end: "end",
113
+ dateValue: (date) => date.toISOString(),
113
114
  });
114
115
 
115
116
  setAppointments(optimisticAppointments);
@@ -144,11 +145,11 @@ export const SchedulerExample = () => {
144
145
  selectedDate={selectedDate}
145
146
  onSelectedDateChange={setSelectedDate}
146
147
  adapter={{
147
- getId: (item) => item.id,
148
- getResourceId: (item) => item.staffId,
149
- getStart: (item) => item.start,
150
- getEnd: (item) => item.end,
151
- getTitle: (item) => `${item.customerName} - ${item.title}`,
148
+ id: "id",
149
+ resourceId: "staffId",
150
+ start: "start",
151
+ end: "end",
152
+ title: (item) => `${item.customerName} - ${item.title}`,
152
153
  }}
153
154
  onAppointmentChange={handleAppointmentChange}
154
155
  dayStart="09:00"
@@ -210,7 +211,33 @@ Appointments stay in your own shape. The scheduler reads them through the `adapt
210
211
 
211
212
  ### `adapter`
212
213
 
213
- The adapter maps your appointment structure into scheduler fields:
214
+ The simplest adapter maps appointment object fields by key:
215
+
216
+ ```tsx
217
+ adapter={{
218
+ id: "id",
219
+ resourceId: "staffId",
220
+ start: "start",
221
+ end: "end",
222
+ title: "title",
223
+ }}
224
+ ```
225
+
226
+ Each field can also be a function when you need to derive a value:
227
+
228
+ ```tsx
229
+ adapter={{
230
+ id: "id",
231
+ resourceId: "staffId",
232
+ start: "start",
233
+ end: "end",
234
+ title: (item) => `${item.customerName} - ${item.title}`,
235
+ }}
236
+ ```
237
+
238
+ Start and end fields can resolve to either a `Date` or a date string.
239
+
240
+ The older getter adapter is still supported:
214
241
 
215
242
  ```tsx
216
243
  adapter={{
@@ -222,8 +249,6 @@ adapter={{
222
249
  }}
223
250
  ```
224
251
 
225
- `getStart` and `getEnd` can return either a `Date` or a date string.
226
-
227
252
  ## Drag, Resize, and Persistence
228
253
 
229
254
  Use `onAppointmentChange` as the main integration point for move and resize operations.
@@ -231,6 +256,8 @@ Use `onAppointmentChange` as the main integration point for move and resize oper
231
256
  It receives:
232
257
 
233
258
  - `appointment`: the original raw appointment
259
+ - `resourceId`, `start`, and `end`: the new values after drop
260
+ - `previousResourceId`, `previousStart`, and `previousEnd`: the values before drag or resize
234
261
  - `previous`: the previous resource and time range
235
262
  - `next`: the new resource and time range after drop
236
263
  - `kind`: `"move"` or `"resize"`
@@ -240,12 +267,12 @@ Example:
240
267
  ```tsx
241
268
  <Scheduler
242
269
  // ...other props
243
- onAppointmentChange={async ({ appointment, next }) => {
270
+ onAppointmentChange={async ({ appointment, resourceId, start, end }) => {
244
271
  const nextAppointment = {
245
272
  ...appointment,
246
- staffId: next.resourceId,
247
- start: next.start.toISOString(),
248
- end: next.end.toISOString(),
273
+ staffId: resourceId,
274
+ start: start.toISOString(),
275
+ end: end.toISOString(),
249
276
  };
250
277
 
251
278
  await fetch(`/api/appointments/${appointment.id}`, {
@@ -261,15 +288,29 @@ If you want a small helper for optimistic local state updates, use `applySchedul
261
288
 
262
289
  ```tsx
263
290
  const nextAppointments = applySchedulerAppointmentChange(appointments, change, {
264
- getId: (item) => item.id,
265
- setResourceId: (item, resourceId) => ({ ...item, staffId: resourceId }),
266
- setStart: (item, start) => ({ ...item, start: start.toISOString() }),
267
- setEnd: (item, end) => ({ ...item, end: end.toISOString() }),
291
+ id: "id",
292
+ resourceId: "staffId",
293
+ start: "start",
294
+ end: "end",
295
+ dateValue: (date) => date.toISOString(),
268
296
  });
269
297
  ```
270
298
 
299
+ The previous setter-based helper options are still supported for non-object data or custom immutable updates.
300
+
271
301
  `onPersistMoveResize` is still available as a legacy callback, but `onAppointmentChange` is the recommended API.
272
302
 
303
+ If you want to render the scheduler in read-only mode, use `editable={false}`:
304
+
305
+ ```tsx
306
+ <Scheduler
307
+ // ...other props
308
+ editable={false}
309
+ />
310
+ ```
311
+
312
+ When `editable` is `false`, move and resize interactions are disabled.
313
+
273
314
  ## Styling
274
315
 
275
316
  The package ships precompiled CSS:
@@ -440,11 +481,12 @@ If you want to keep the default toolbar but swap the date picker UI, use `render
440
481
  - `appointments`: array of raw appointment objects
441
482
  - `selectedDate`: currently visible day
442
483
  - `onSelectedDateChange`: controlled date change handler
443
- - `adapter`: mapper between your appointment shape and scheduler fields
484
+ - `adapter`: key-based or getter-based mapper between your appointment shape and scheduler fields
444
485
 
445
486
  ### Common optional props
446
487
 
447
- - `onAppointmentChange`: async or sync handler for move and resize persistence
488
+ - `onAppointmentChange`: async or sync handler for move and resize persistence; receives both flat next values and the nested `previous`/`next` objects
489
+ - `editable`: enables or disables move and resize interactions, defaults to `true`
448
490
  - `renderToolbar`: replace the full toolbar
449
491
  - `renderDatePicker`: replace only the date picker slot used by the default toolbar
450
492
  - `renderResourceHeader`: custom resource header renderer
@@ -464,6 +506,7 @@ If you want to keep the default toolbar but swap the date picker UI, use `render
464
506
  - Keep `selectedDate` in application state and fetch data when it changes.
465
507
  - Prefer formatting dates in local time for day-based API queries. `toISOString().slice(0, 10)` can shift the day around midnight because it uses UTC.
466
508
  - If persistence fails after a drag or resize, either roll back local state or refetch the visible day.
509
+ - For large schedules, keep `resources`, `appointments`, adapter objects, and render callbacks stable when their data has not changed so React can reuse scheduler calculations.
467
510
  - Import the package CSS once at app startup.
468
511
 
469
512
  ## Development
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var jsxRuntime=require('react/jsx-runtime'),dateFns=require('date-fns'),h=require('react');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var h__namespace=/*#__PURE__*/_interopNamespace(h);function G({appointment:e,isDropInvalid:t,onPointerDown:r,onResizePointerDown:s,appointmentAppearance:o,appointmentBackgroundColor:i}){let c=e.raw,a=typeof c.description=="string"?c.description:void 0,n=typeof i=="string"?i:void 0,d=o?.className??n??"rfs:bg-muted/40 rfs:dark:bg-muted/30",m=t?"rfs:bg-red-100/80 rfs:text-red-950 rfs:dark:bg-red-950/40 rfs:dark:text-red-100":"",p=e.visualState==="ghost"?"rfs:cursor-grab rfs:opacity-35":e.visualState==="dragging"?"rfs:cursor-grabbing rfs:opacity-55 rfs:shadow-xl":"rfs:cursor-grab",R=`rfs:relative rfs:h-full rfs:overflow-hidden rfs:rounded-md rfs:p-2 rfs:pb-5 rfs:text-foreground ${d} ${m} ${p}`;return jsxRuntime.jsxs("div",{onPointerDown:r,className:R,children:[t?jsxRuntime.jsx("div",{className:"rfs:absolute rfs:right-1 rfs:top-1 rfs:flex rfs:h-4 rfs:w-4 rfs:items-center rfs:justify-center rfs:rounded-full rfs:bg-red-600 rfs:text-[10px] rfs:font-bold rfs:text-white",children:"X"}):null,jsxRuntime.jsx("div",{className:"rfs:text-xs rfs:font-semibold",children:e.title}),a?jsxRuntime.jsx("div",{className:"rfs:mt-1 rfs:text-[10px] rfs:font-medium rfs:text-muted-foreground",children:a}):null,jsxRuntime.jsx("div",{role:"button","aria-label":"Resize appointment",onPointerDown:l=>{e.visualState!=="ghost"&&(l.stopPropagation(),s(l));},className:"rfs:absolute rfs:inset-x-1 rfs:bottom-1 rfs:h-2 rfs:cursor-ns-resize rfs:rounded-full rfs:bg-border/90 rfs:transition-colors rfs:hover:bg-border"})]})}function fe(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var me={slate:"bg-slate-100 dark:bg-slate-900/40",gray:"bg-gray-100 dark:bg-gray-900/40",zinc:"bg-zinc-100 dark:bg-zinc-900/40",neutral:"bg-neutral-100 dark:bg-neutral-900/40",stone:"bg-stone-100 dark:bg-stone-900/40",red:"bg-red-100 dark:bg-red-950/40",orange:"bg-orange-100 dark:bg-orange-950/40",amber:"bg-amber-100 dark:bg-amber-950/40",yellow:"bg-yellow-100 dark:bg-yellow-950/40",lime:"bg-lime-100 dark:bg-lime-950/40",green:"bg-green-100 dark:bg-green-950/40",emerald:"bg-emerald-100 dark:bg-emerald-950/40",teal:"bg-teal-100 dark:bg-teal-950/40",cyan:"bg-cyan-100 dark:bg-cyan-950/40",sky:"bg-sky-100 dark:bg-sky-950/40",blue:"bg-blue-100 dark:bg-blue-950/40",indigo:"bg-indigo-100 dark:bg-indigo-950/40",violet:"bg-violet-100 dark:bg-violet-950/40",purple:"bg-purple-100 dark:bg-purple-950/40",fuchsia:"bg-fuchsia-100 dark:bg-fuchsia-950/40",pink:"bg-pink-100 dark:bg-pink-950/40",rose:"bg-rose-100 dark:bg-rose-950/40"};function D(e,t,r){return Math.max(t,Math.min(r,e))}function X(e,t=15){return Math.round(e/t)*t}function ne(e){let[t,r]=e.split(":").map(Number);return t*60+r}function Re(e){return `${e.firstName??""} ${e.lastName??""}`.trim()}function K(e){return dateFns.format(e,"yyyy-MM-dd")}function oe(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function _(e,t,r){let s=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),o=t+r,i=Math.floor(o/60),c=o%60;return s.setHours(i,c,0,0),s}function se(e,t){return t.getHours()*60+t.getMinutes()-e}function ie(e,t){return e.startMin<t.endMin&&t.startMin<e.endMin}function ge(e){let t=[...e].sort((c,a)=>c.startMin-a.startMin||c.endMin-a.endMin),r=[],s=[],o=[];for(let c of t)s=s.filter(n=>n.endMin>c.startMin),!s.some(n=>ie(n,c))&&o.length>0&&(r.push(o),o=[]),o.push(c),s.push(c);o.length&&r.push(o);let i=[];for(let c of r){let a=[...c].sort((p,R)=>p.startMin-R.startMin||p.endMin-R.endMin),n=[],d=new Map;for(let p of a){let R=false;for(let l=0;l<n.length;l++)if(n[l]<=p.startMin){n[l]=p.endMin,d.set(p.id,l),R=true;break}R||(n.push(p.endMin),d.set(p.id,n.length-1));}let m=n.length;for(let p of a)i.push({...p,lane:d.get(p.id)??0,lanes:m});}return i}function ae({fallback:e,getValue:t,resources:r,toKey:s}){let o=new Map;for(let i of r)o.set(s(i),t(i)??e);return o}function he({adapter:e,appointments:t,dayMinutes:r,dayStartAbs:s,selectedISO:o}){return t.map(i=>{let c=new Date(e.getStart(i)),a=new Date(e.getEnd(i));return {raw:i,id:e.getId(i),resourceId:e.getResourceId(i),start:c,end:a,startMin:D(se(s,c),0,r),endMin:D(se(s,a),0,r),title:e.getTitle(i),renderKey:String(e.getId(i)),visualState:"normal"}}).filter(i=>K(i.start)===o)}function Te(e){return new Map(e.map(t=>[t.id,t]))}function be(e,t,r,s){return t.kind==="none"||t.kind==="move"?e:e.map(o=>o.id!==t.appointmentId?o:{...o,resourceId:t.resourceId,startMin:t.startMin,endMin:t.endMin,start:_(r,s,t.startMin),end:_(r,s,t.endMin),visualState:"dragging"})}function Se(e,t){let r=new Map;for(let o of t){let i=r.get(o.resourceId)??[];i.push(o),r.set(o.resourceId,i);}let s=new Map;for(let o of e)s.set(o.id,ce(r.get(o.id)??[]));return s}function ce(e){return ge(e.map(t=>({...t,appointmentId:t.id,id:t.renderKey}))).map(({appointmentId:t,...r})=>({...r,id:t}))}function Ie(e,t,r,s,o){let i=new Map;for(let c of e){let a=t?.[String(c.id)];if(a){i.set(c.id,{className:a});continue}let n=r?.(c);if(n){i.set(c.id,n);continue}let d=s.get(c.id);if(d){i.set(c.id,{className:d});continue}let m=o.get(c.id);i.set(c.id,m?{className:m}:void 0);}return i}function Ae({adapter:e,appointments:t,dayEnd:r="18:00",dayStart:s="09:00",resources:o,selectedDate:i}){let c=h__namespace.useMemo(()=>ne(s),[s]),a=h__namespace.useMemo(()=>ne(r),[r]),n=h__namespace.useMemo(()=>Math.max(0,a-c),[a,c]),d=h__namespace.useMemo(()=>12+n*2+24,[n]),m=h__namespace.useMemo(()=>72+Math.max(o.length,1)*420,[o.length]),p=h__namespace.useMemo(()=>K(i),[i]),R=h__namespace.useMemo(()=>he({adapter:e,appointments:t,dayMinutes:n,dayStartAbs:c,selectedISO:p}),[e,t,n,c,p]);return {appointmentMap:h__namespace.useMemo(()=>Te(R),[R]),dayEndAbs:a,dayMinutes:n,dayStartAbs:c,gridHeight:d,gridMinWidth:m,renderAppts:R}}var ot=4,st=(e,t)=>{e(r=>r&&{...r,clientX:t.clientX,clientY:t.clientY});},it=e=>{let{dragRef:t,pendingDragRef:r,pointer:s,setDrag:o,setMovePreview:i,suppressClickRef:c}=e,a=r.current;if(!a||a.drag.pointerId!==s.pointerId)return;let n=s.clientX-a.startClientX,d=s.clientY-a.startClientY;Math.hypot(n,d)<ot||(c.current=true,t.current=a.drag,o(a.drag),a.drag.kind==="move"&&i({appointment:a.appointment,clientX:s.clientX,clientY:s.clientY,width:a.width,height:a.height,offsetX:a.offsetX,offsetY:a.offsetY}),r.current=null);},at=(e,t,r,s,o)=>{let i=s(t.clientX,e.resourceId),a=o(i,t.clientY)-e.offsetMin,n=D(X(a),0,r-e.durationMin),d=n+e.durationMin;return n===e.startMin&&d===e.endMin&&i===e.resourceId?null:{...e,resourceId:i,startMin:n,endMin:d}},ct=(e,t,r,s)=>{let o=s(e.resourceId,t.clientY),i=D(X(o),e.startMin+15,r);return i===e.endMin?null:{...e,endMin:i}},Pe=e=>{let{dayMinutes:t,dragRef:r,latestPointerRef:s,pendingDragRef:o,pointerToMin:i,pointerToResourceId:c,setDrag:a,setMovePreview:n,suppressClickRef:d}=e,m=s.current;if(!m)return;let p=r.current;if(p.kind==="none"&&o.current){it({pointer:m,pendingDragRef:o,setDrag:a,setMovePreview:n,dragRef:r,suppressClickRef:d});return}if(p.kind==="none")return;if(p.kind==="move"){st(n,m);let l=at(p,m,t,c,i);l&&(d.current=true,r.current=l,a(l));return}let R=ct(p,m,t,i);R&&(d.current=true,r.current=R,a(R));},xe=e=>{let{dragRef:t,frameRef:r,latestPointerRef:s,pendingDragRef:o,persistDrag:i,setDrag:c,setMovePreview:a,suppressClickRef:n}=e;r.current!==null&&(window.cancelAnimationFrame(r.current),r.current=null),s.current=null,o.current=null,a(null);let d=t.current;d.kind!=="none"&&(c({kind:"none"}),t.current={kind:"none"},n.current&&i(d));};var De=({appointmentMap:e,dayMinutes:t,dayStartAbs:r,onAppointmentChange:s,onPersistMoveResize:o,renderAppts:i,resources:c,selectedDate:a})=>{let[n,d]=h__namespace.useState({kind:"none"}),[m,p]=h__namespace.useState(null),R=h__namespace.useRef({}),l=h__namespace.useRef(false),b=h__namespace.useRef({kind:"none"}),A=h__namespace.useRef(null),I=h__namespace.useRef(null),T=h__namespace.useRef(null);h__namespace.useEffect(()=>{b.current=n;},[n]),h__namespace.useEffect(()=>()=>{T.current!==null&&window.cancelAnimationFrame(T.current);},[]);let M=h__namespace.useCallback((u,f)=>{let g=R.current[String(u)];if(!g)return 0;let y=f-g.getBoundingClientRect().top-12;return D(X(y/2),0,t)},[t]),V=h__namespace.useCallback((u,f)=>{for(let g of c){let y=R.current[String(g.id)];if(!y)continue;let Y=y.getBoundingClientRect();if(u>=Y.left&&u<=Y.right)return g.id}return f},[c]),E=h__namespace.useCallback((u,f,g,y)=>i.filter(k=>k.resourceId===f&&k.id!==u).some(k=>ie(k,{startMin:g,endMin:y})),[i]),z=h__namespace.useMemo(()=>n.kind==="none"?false:E(n.appointmentId,n.resourceId,n.startMin,n.endMin),[n,E]),O=h__namespace.useCallback(async u=>{let f=e.get(u.appointmentId);if(!f||E(u.appointmentId,u.resourceId,u.startMin,u.endMin))return;let g={resourceId:u.resourceId,start:_(a,r,u.startMin),end:_(a,r,u.endMin)};if(s){await s({kind:u.kind,appointment:f.raw,previous:{resourceId:f.resourceId,start:f.start,end:f.end},next:g});return}o&&await o({appointment:f.raw,resourceId:g.resourceId,start:g.start,end:g.end});},[e,r,E,s,o,a]),$=h__namespace.useCallback((u,f)=>{if(u.button!==0)return;u.stopPropagation(),l.current=false;let g=u.currentTarget.getBoundingClientRect(),y=M(f.resourceId,u.clientY);A.current={drag:{kind:"move",appointmentId:f.id,pointerId:u.pointerId,resourceId:f.resourceId,durationMin:Math.max(15,f.endMin-f.startMin),offsetMin:y-f.startMin,startMin:f.startMin,endMin:f.endMin},appointment:f,startClientX:u.clientX,startClientY:u.clientY,width:g.width,height:g.height,offsetX:u.clientX-g.left,offsetY:u.clientY-g.top};},[M]),j=h__namespace.useCallback((u,f)=>{u.button===0&&(u.stopPropagation(),l.current=false,A.current={drag:{kind:"resize",appointmentId:f.id,pointerId:u.pointerId,resourceId:f.resourceId,startMin:f.startMin,endMin:f.endMin},appointment:f,startClientX:u.clientX,startClientY:u.clientY,width:0,height:0,offsetX:0,offsetY:0});},[]),F=h__namespace.useCallback(u=>{I.current={clientX:u.clientX,clientY:u.clientY,pointerId:u.pointerId},T.current===null&&(T.current=window.requestAnimationFrame(()=>{T.current=null,Pe({dayMinutes:t,dragRef:b,latestPointerRef:I,pendingDragRef:A,pointerToMin:M,pointerToResourceId:V,setDrag:d,setMovePreview:p,suppressClickRef:l});}));},[t,M,V]),ee=h__namespace.useCallback(()=>{xe({dragRef:b,frameRef:T,latestPointerRef:I,pendingDragRef:A,persistDrag:O,setDrag:d,setMovePreview:p,suppressClickRef:l});},[O]);return {colRefs:R,drag:n,isDropInvalid:z,movePreview:m,onApptPointerDown:$,onGlobalPointerMove:F,onGlobalPointerUp:ee,onResizePointerDown:j,suppressClickRef:l}};function ke({appointmentColorTokenClassMap:e,dayStartAbs:t,drag:r,getResourceAppointmentAppearance:s,getResourceAppointmentBackground:o,getResourceAppointmentColorToken:i,renderAppts:c,resourceAppointmentClassMap:a,resources:n,selectedDate:d}){let m=h__namespace.useMemo(()=>be(c,r,d,t),[t,r,c,d]),p=h__namespace.useMemo(()=>Se(n,c),[c,n]),R=h__namespace.useMemo(()=>{if(r.kind!=="resize")return p;let I=new Map(p),T=m.filter(M=>M.resourceId===r.resourceId);return I.set(r.resourceId,ce(T)),I},[p,r,m]),l=h__namespace.useMemo(()=>o?ae({fallback:void 0,getValue:o,resources:n,toKey:I=>I.id}):new Map,[o,n]),b=h__namespace.useMemo(()=>{if(!i)return new Map;let I={...me,...e??{}};return ae({fallback:void 0,getValue:T=>{let M=i(T);return M?I[M]:void 0},resources:n,toKey:T=>T.id})},[e,i,n]);return {appointmentAppearanceByResource:h__namespace.useMemo(()=>Ie(n,a,s,b,l),[l,b,s,a,n]),appointmentBgByResource:l,effectiveAppts:m,laidOutByResource:R}}function we({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsxRuntime.jsx("div",{className:"rfs-times rfs:border-border rfs:bg-card",style:{width:72,height:r},children:Array.from({length:Math.floor(e/60)+1}).map((s,o)=>jsxRuntime.jsxs("div",{className:"rfs-time-tick rfs:text-muted-foreground",style:{top:12+o*60*2},children:[String(Math.floor((t+o*60)/60)).padStart(2,"0"),":",String((t+o*60)%60).padStart(2,"0")]},`tick-${o}`))})}function Ne({resource:e}){return jsxRuntime.jsx("strong",{children:e.label})}function Ee({resources:e,renderResourceHeader:t}){return jsxRuntime.jsxs("div",{className:"rfs-header rfs:border-border rfs:bg-card",children:[jsxRuntime.jsx("div",{className:"rfs-gutter rfs:border-border",style:{width:72}}),e.map(r=>jsxRuntime.jsxs("div",{className:"rfs-resource-header rfs:border-border rfs:bg-card rfs:text-foreground",style:{minWidth:420,flex:1},children:[(t??(s=>Ne({resource:s})))(r),fe(r)?jsxRuntime.jsx("div",{className:"rfs-resource-subtitle rfs:text-muted-foreground",children:Re(r)}):null]},String(r.id)))]})}var Oe=({resource:e,colRefs:t,gridHeight:r,dayMinutes:s,appointments:o,appointmentAppearance:i,appointmentBg:c,isDropInvalid:a,renderAppointment:n,onApptPointerDown:d,onResizePointerDown:m,drag:p,suppressClickRef:R})=>jsxRuntime.jsx("div",{className:"rfs-col rfs:border-border rfs:bg-card",style:{minWidth:420,flex:1},children:jsxRuntime.jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner rfs:bg-card",style:{height:r},children:[Array.from({length:Math.floor(s/60)+1}).map((l,b)=>jsxRuntime.jsx("div",{className:"rfs-hour-line rfs:border-border/70",style:{top:12+b*60*2}},`major-${b}`)),Array.from({length:Math.floor(s/15)+1}).map((l,b)=>jsxRuntime.jsx("div",{className:"rfs-slot-line rfs:border-border/50",style:{top:12+b*15*2}},`minor-${b}`)),o.map(l=>{let b=100/l.lanes,A=12+l.startMin*2,I=Math.max(30,(l.endMin-l.startMin)*2);return jsxRuntime.jsx("div",{className:`rfs-card-slot ${l.visualState==="ghost"?"rfs-card-slot--ghost":""} ${l.visualState==="dragging"?"rfs-card-slot--dragging":""}`,style:{top:A,left:`${b*l.lane}%`,width:`${b}%`,height:I},children:(n??G)({appointment:l,isDropInvalid:a&&p.kind==="resize"&&l.id===p.appointmentId,onPointerDown:T=>d(T,l),onResizePointerDown:T=>m(T,l),appointmentAppearance:i,appointmentBackgroundColor:c,drag:p,suppressClickRef:R})},l.renderKey)})]})});var ft=(e,t)=>[e.resource===t.resource,e.colRefs===t.colRefs,e.gridHeight===t.gridHeight,e.dayMinutes===t.dayMinutes,e.appointments===t.appointments,e.appointmentAppearance===t.appointmentAppearance,e.appointmentBg===t.appointmentBg,e.isDropInvalid===t.isDropInvalid,e.renderAppointment===t.renderAppointment,e.onApptPointerDown===t.onApptPointerDown,e.onResizePointerDown===t.onResizePointerDown,e.drag===t.drag,e.suppressClickRef===t.suppressClickRef].every(Boolean),_e=h__namespace.memo(Oe,ft);function H(...e){return e.filter(Boolean).join(" ")}var mt={default:"rfs:bg-primary rfs:text-primary-foreground rfs:hover:bg-primary/90",outline:"rfs:border rfs:border-border rfs:bg-card rfs:text-foreground rfs:hover:bg-muted",ghost:"rfs:text-foreground rfs:hover:bg-muted"},Rt={default:"rfs:h-9 rfs:px-4 rfs:py-2",sm:"rfs:h-8 rfs:px-3 rfs:text-xs",icon:"rfs:h-8 rfs:w-8"},P=h__namespace.forwardRef(function({className:t,variant:r="default",size:s="default",type:o="button",...i},c){return jsxRuntime.jsx("button",{ref:c,type:o,className:H("rfs:inline-flex rfs:items-center rfs:justify-center rfs:gap-2 rfs:rounded-md rfs:text-sm rfs:font-medium rfs:whitespace-nowrap rfs:transition-colors rfs:focus-visible:outline-none rfs:focus-visible:ring-2 rfs:focus-visible:ring-ring rfs:focus-visible:ring-offset-2 rfs:disabled:pointer-events-none rfs:disabled:opacity-50",mt[r],Rt[s],t),...i})});function Ue({selected:e,onSelect:t}){let[r,s]=h__namespace.useState(e??new Date);h__namespace.useEffect(()=>{e&&s(e);},[e]);let o=dateFns.startOfMonth(r),i=dateFns.startOfWeek(o,{weekStartsOn:1}),c=dateFns.endOfWeek(dateFns.endOfMonth(r),{weekStartsOn:1}),a=[];for(let n=i;n<=c;n=dateFns.addDays(n,1))a.push(n);return jsxRuntime.jsxs("div",{className:"rfs:w-72 rfs:rounded-md rfs:bg-popover",children:[jsxRuntime.jsxs("div",{className:"rfs:mb-2 rfs:flex rfs:items-center rfs:justify-between",children:[jsxRuntime.jsx(P,{variant:"ghost",size:"icon","aria-label":"Previous month",onClick:()=>s(dateFns.addMonths(r,-1)),children:"<"}),jsxRuntime.jsx("div",{className:"rfs:text-sm rfs:font-medium",children:dateFns.format(r,"MMMM yyyy")}),jsxRuntime.jsx(P,{variant:"ghost",size:"icon","aria-label":"Next month",onClick:()=>s(dateFns.addMonths(r,1)),children:">"})]}),jsxRuntime.jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1 rfs:text-center rfs:text-xs rfs:text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(n=>jsxRuntime.jsx("div",{className:"rfs:py-1",children:n},n))}),jsxRuntime.jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1",children:a.map(n=>{let d=e?dateFns.isSameDay(n,e):false;return jsxRuntime.jsx(P,{variant:d?"default":"ghost",size:"icon",className:H("rfs:text-xs",!dateFns.isSameMonth(n,r)&&"rfs:text-muted-foreground rfs:opacity-60",dateFns.isToday(n)&&!d&&"rfs:border rfs:border-border"),onClick:()=>t?.(n),children:dateFns.format(n,"d")},n.toISOString())})})]})}var Ve=h__namespace.createContext(null);function $e(){let e=h__namespace.useContext(Ve);if(!e)throw new Error("Popover components must be used within Popover.");return e}function Fe({children:e,open:t,onOpenChange:r}){let[s,o]=h__namespace.useState(false),i=h__namespace.useRef(null),c=h__namespace.useRef(null),a=t??s,n=h__namespace.useCallback(d=>{let m=typeof d=="function"?d(a):d;t===void 0&&o(m),r?.(m);},[t,r,a]);return h__namespace.useEffect(()=>{if(!a)return;let d=p=>{let R=p.target;i.current?.contains(R)||c.current?.contains(R)||n(false);},m=p=>{p.key==="Escape"&&n(false);};return document.addEventListener("mousedown",d),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",d),document.removeEventListener("keydown",m);}},[a,n]),jsxRuntime.jsx(Ve.Provider,{value:{open:a,setOpen:n,triggerRef:i,contentRef:c},children:jsxRuntime.jsx("div",{className:"rfs:relative rfs:inline-flex",children:e})})}function We({children:e,asChild:t=false}){let{open:r,setOpen:s,triggerRef:o}=$e();if(t&&h__namespace.isValidElement(e)){let i=e;return h__namespace.cloneElement(i,{ref:o,"aria-expanded":r,onClick:c=>{i.props.onClick?.(c),s(a=>!a);}})}return jsxRuntime.jsx("button",{ref:o,type:"button","aria-expanded":r,onClick:()=>s(i=>!i),children:e})}function Ge({children:e,className:t,align:r="start"}){let{open:s,contentRef:o}=$e();return s?jsxRuntime.jsx("div",{ref:o,className:H("rfs:absolute rfs:top-full rfs:z-50 rfs:mt-2 rfs:min-w-72 rfs:rounded-md rfs:border rfs:border-border rfs:bg-popover rfs:p-2 rfs:text-popover-foreground rfs:shadow-md rfs:outline-none",r==="start"&&"rfs:left-0",r==="center"&&"rfs:left-1/2 rfs:-translate-x-1/2",r==="end"&&"rfs:right-0",t),children:e}):null}function Ke({selectedDate:e,onSelectedDateChange:t}){return jsxRuntime.jsxs(Fe,{children:[jsxRuntime.jsx(We,{asChild:true,children:jsxRuntime.jsx(P,{variant:"outline",size:"sm",className:"rfs:min-w-40 rfs:justify-start rfs:text-left rfs:font-normal",children:dateFns.format(e,"PPP")})}),jsxRuntime.jsx(Ge,{className:"rfs:w-auto rfs:p-2",align:"center",children:jsxRuntime.jsx(Ue,{selected:e,onSelect:t})})]})}function qe({goToPreviousDay:e,goToNextDay:t,defaultDatePicker:r,prevButtonLabel:s="Prev",nextButtonLabel:o="Next"}){return jsxRuntime.jsx("div",{className:"rfs-toolbar",children:jsxRuntime.jsxs("div",{className:"rfs:flex rfs:items-center rfs:gap-2 rfs:rounded-lg rfs:border rfs:border-border rfs:bg-card rfs:p-1 rfs:shadow-xs",children:[jsxRuntime.jsx(P,{variant:"outline",size:"sm",onClick:e,children:s}),r,jsxRuntime.jsx(P,{variant:"outline",size:"sm",onClick:t,children:o})]})})}function Ze({selectedDate:e,onSelectedDateChange:t,prevButtonLabel:r,nextButtonLabel:s,renderToolbar:o,renderDatePicker:i}){let c=()=>t(oe(e,-1)),a=()=>t(oe(e,1)),n=(i??Ke)({selectedDate:e,onSelectedDateChange:t});return o?jsxRuntime.jsx(jsxRuntime.Fragment,{children:o({selectedDate:e,onSelectedDateChange:t,goToPreviousDay:c,goToNextDay:a,defaultDatePicker:n})}):jsxRuntime.jsx(jsxRuntime.Fragment,{children:qe({goToPreviousDay:c,goToNextDay:a,defaultDatePicker:n,prevButtonLabel:r,nextButtonLabel:s})})}var Dt={kind:"none"};function kt({resources:e,appointments:t,selectedDate:r,onSelectedDateChange:s,adapter:o,onPersistMoveResize:i,onAppointmentChange:c,renderResourceHeader:a,renderAppointment:n,resourceAppointmentClassMap:d,getResourceAppointmentAppearance:m,getResourceAppointmentColorToken:p,appointmentColorTokenClassMap:R,getResourceAppointmentBackground:l,renderToolbar:b,renderDatePicker:A,prevButtonLabel:I="Prev",nextButtonLabel:T="Next",dayStart:M="09:00",dayEnd:V="18:00"}){let{appointmentMap:E,dayMinutes:z,dayStartAbs:O,gridHeight:$,gridMinWidth:j,renderAppts:F}=Ae({adapter:o,appointments:t,dayEnd:V,dayStart:M,resources:e,selectedDate:r}),{colRefs:ee,drag:u,isDropInvalid:f,movePreview:g,onApptPointerDown:y,onGlobalPointerMove:Y,onGlobalPointerUp:k,onResizePointerDown:et,suppressClickRef:le}=De({appointmentMap:E,dayMinutes:z,dayStartAbs:O,onAppointmentChange:c,onPersistMoveResize:i,renderAppts:F,resources:e,selectedDate:r}),{appointmentAppearanceByResource:te,appointmentBgByResource:re,laidOutByResource:tt}=ke({appointmentColorTokenClassMap:R,dayStartAbs:O,drag:u,getResourceAppointmentAppearance:m,getResourceAppointmentBackground:l,getResourceAppointmentColorToken:p,renderAppts:F,resourceAppointmentClassMap:d,resources:e,selectedDate:r}),x=h__namespace.useMemo(()=>u.kind!=="move"||!g?null:{appointment:{...g.appointment,resourceId:u.resourceId,startMin:u.startMin,endMin:u.endMin,visualState:"ghost",renderKey:`${g.appointment.renderKey}-overlay`,lane:0,lanes:1},appearance:te.get(u.resourceId),background:re.get(u.resourceId),left:g.clientX-g.offsetX,top:g.clientY-g.offsetY,width:g.width,height:g.height},[te,re,u,g]);return jsxRuntime.jsxs("section",{className:`rfs-root rfs:rounded-lg rfs:bg-background rfs:text-foreground ${u.kind==="move"?"rfs-root--drag-move":""} ${u.kind==="resize"?"rfs-root--drag-resize":""}`,onPointerMove:Y,onPointerUp:k,onPointerCancel:k,children:[jsxRuntime.jsx(Ze,{selectedDate:r,onSelectedDateChange:s,prevButtonLabel:I,nextButtonLabel:T,renderToolbar:b,renderDatePicker:A}),jsxRuntime.jsx("div",{className:"rfs-shell rfs:border-border rfs:bg-card",children:jsxRuntime.jsxs("div",{style:{minWidth:j},children:[jsxRuntime.jsx(Ee,{resources:e,renderResourceHeader:a}),jsxRuntime.jsxs("div",{className:"rfs-body",children:[jsxRuntime.jsx(we,{dayMinutes:z,dayStartAbs:O,gridHeight:$}),jsxRuntime.jsx("div",{className:"rfs-grid",children:e.map(L=>jsxRuntime.jsx(_e,{resource:L,colRefs:ee,gridHeight:$,dayMinutes:z,appointments:tt.get(L.id)??[],appointmentAppearance:te.get(L.id),appointmentBg:re.get(L.id),isDropInvalid:f,renderAppointment:n,onApptPointerDown:y,onResizePointerDown:et,drag:u.kind==="resize"&&u.resourceId===L.id?u:Dt,suppressClickRef:le},String(L.id)))})]})]})}),x?jsxRuntime.jsx("div",{className:"rfs-drag-overlay",style:{left:x.left,top:x.top,width:x.width,height:x.height},children:(n??G)({appointment:x.appointment,isDropInvalid:f,onPointerDown:()=>{},onResizePointerDown:()=>{},appointmentAppearance:x.appearance,appointmentBackgroundColor:x.background,drag:u,suppressClickRef:le})}):null]})}function wt(e,t,r){return e.map(s=>{if(r.getId(s)!==r.getId(t.appointment))return s;let o=r.setResourceId(s,t.next.resourceId),i=r.setStart(o,t.next.start);return r.setEnd(i,t.next.end)})}exports.Scheduler=kt;exports.applySchedulerAppointmentChange=wt;
1
+ 'use strict';var jsxRuntime=require('react/jsx-runtime'),dateFns=require('date-fns'),g=require('react');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var g__namespace=/*#__PURE__*/_interopNamespace(g);var ct=e=>{let{isDropInvalid:t,description:r,title:o}=e;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[t&&jsxRuntime.jsx("div",{className:"rfs:absolute rfs:right-1 rfs:top-1 rfs:flex rfs:h-4 rfs:w-4 rfs:items-center rfs:justify-center rfs:rounded-full rfs:bg-red-600 rfs:text-[10px] rfs:font-bold rfs:text-white",children:"X"}),jsxRuntime.jsx("div",{className:"rfs:text-xs rfs:font-semibold",children:o}),r&&jsxRuntime.jsx("div",{className:"rfs:mt-1 rfs:text-[10px] rfs:font-medium",children:r})]})},ge=ct;function ie({appointment:e,onResizePointerDown:t}){return jsxRuntime.jsx("div",{role:"button","aria-label":"Resize appointment",onPointerDown:r=>{e.visualState!=="ghost"&&(r.stopPropagation(),t(r));},className:"rfs:absolute rfs:inset-x-1 rfs:bottom-1 rfs:h-2 rfs:cursor-ns-resize rfs:rounded-full rfs:bg-border/90 rfs:transition-colors rfs:hover:bg-border"})}function q({appointment:e,isDropInvalid:t,onPointerDown:r,onResizePointerDown:o,appointmentAppearance:n,appointmentBackgroundColor:i}){let u=e.raw,d=typeof u.description=="string"?u.description:void 0,s=typeof i=="string"?i:void 0,c=n?.className??s??"rfs:bg-muted/40 rfs:dark:bg-muted/30",m=t?"rfs:bg-red-100/80 rfs:text-red-950 rfs:dark:bg-red-950/40 rfs:dark:text-red-100":"",f=e.visualState==="ghost"?"rfs:cursor-grab rfs:opacity-35":e.visualState==="dragging"?"rfs:cursor-grabbing rfs:opacity-55 rfs:shadow-xl":"rfs:cursor-grab",R=`rfs:relative rfs:h-full rfs:overflow-hidden rfs:rounded-md rfs:p-2 rfs:pb-5 rfs:text-foreground ${c} ${m} ${f}`;return jsxRuntime.jsxs("div",{onPointerDown:r,className:R,children:[jsxRuntime.jsx(ge,{isDropInvalid:t,title:e.title,description:d}),jsxRuntime.jsx(ie,{onResizePointerDown:o,appointment:e})]})}var F=(e,t)=>typeof t=="function"?t(e):e[t],de=e=>"getId"in e?e:{getEnd:t=>F(t,e.end),getId:t=>F(t,e.id),getResourceId:t=>F(t,e.resourceId),getStart:t=>F(t,e.start),getTitle:t=>F(t,e.title)};function Se(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var be={slate:"bg-slate-100 dark:bg-slate-900/40",gray:"bg-gray-100 dark:bg-gray-900/40",zinc:"bg-zinc-100 dark:bg-zinc-900/40",neutral:"bg-neutral-100 dark:bg-neutral-900/40",stone:"bg-stone-100 dark:bg-stone-900/40",red:"bg-red-100 dark:bg-red-950/40",orange:"bg-orange-100 dark:bg-orange-950/40",amber:"bg-amber-100 dark:bg-amber-950/40",yellow:"bg-yellow-100 dark:bg-yellow-950/40",lime:"bg-lime-100 dark:bg-lime-950/40",green:"bg-green-100 dark:bg-green-950/40",emerald:"bg-emerald-100 dark:bg-emerald-950/40",teal:"bg-teal-100 dark:bg-teal-950/40",cyan:"bg-cyan-100 dark:bg-cyan-950/40",sky:"bg-sky-100 dark:bg-sky-950/40",blue:"bg-blue-100 dark:bg-blue-950/40",indigo:"bg-indigo-100 dark:bg-indigo-950/40",violet:"bg-violet-100 dark:bg-violet-950/40",purple:"bg-purple-100 dark:bg-purple-950/40",fuchsia:"bg-fuchsia-100 dark:bg-fuchsia-950/40",pink:"bg-pink-100 dark:bg-pink-950/40",rose:"bg-rose-100 dark:bg-rose-950/40"};function w(e,t,r){return Math.max(t,Math.min(r,e))}function V(e,t=15){return Math.round(e/t)*t}function ue(e){let[t,r]=e.split(":").map(Number);return t*60+r}function Ae(e){return `${e.firstName??""} ${e.lastName??""}`.trim()}function J(e){return dateFns.format(e,"yyyy-MM-dd")}function ce(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function z(e,t,r){let o=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),n=t+r,i=Math.floor(n/60),u=n%60;return o.setHours(i,u,0,0),o}function ae(e,t){return t.getHours()*60+t.getMinutes()-e}function pe(e,t){return e.startMin<t.endMin&&t.startMin<e.endMin}function ye(e){let t=[...e].sort((u,d)=>u.startMin-d.startMin||u.endMin-d.endMin),r=[],o=[],n=[];for(let u of t)o=o.filter(s=>s.endMin>u.startMin),!o.some(s=>pe(s,u))&&n.length>0&&(r.push(n),n=[]),n.push(u),o.push(u);n.length&&r.push(n);let i=[];for(let u of r){let d=[...u].sort((f,R)=>f.startMin-R.startMin||f.endMin-R.endMin),s=[],c=new Map;for(let f of d){let R=false;for(let l=0;l<s.length;l++)if(s[l]<=f.startMin){s[l]=f.endMin,c.set(f.id,l),R=true;break}R||(s.push(f.endMin),c.set(f.id,s.length-1));}let m=s.length;for(let f of d)i.push({...f,lane:c.get(f.id)??0,lanes:m});}return i}function le({fallback:e,getValue:t,resources:r,toKey:o}){let n=new Map;for(let i of r)n.set(o(i),t(i)??e);return n}function Me({adapter:e,appointments:t,dayMinutes:r,dayStartAbs:o,selectedISO:n}){return t.map(i=>{let u=e.getId(i),d=new Date(e.getStart(i)),s=new Date(e.getEnd(i));return {raw:i,id:u,resourceId:e.getResourceId(i),start:d,end:s,startMin:w(ae(o,d),0,r),endMin:w(ae(o,s),0,r),title:e.getTitle(i),renderKey:String(u),visualState:"normal"}}).filter(i=>J(i.start)===n)}function ve(e){return new Map(e.map(t=>[t.id,t]))}function Pe(e,t,r,o){return t.kind==="none"||t.kind==="move"?e:e.map(n=>n.id!==t.appointmentId?n:{...n,resourceId:t.resourceId,startMin:t.startMin,endMin:t.endMin,start:z(r,o,t.startMin),end:z(r,o,t.endMin),visualState:"dragging"})}function xe(e,t){let r=new Map;for(let n of t){let i=r.get(n.resourceId)??[];i.push(n),r.set(n.resourceId,i);}let o=new Map;for(let n of e)o.set(n.id,fe(r.get(n.id)??[]));return o}function fe(e){return ye(e.map(t=>({...t,appointmentId:t.id,id:t.renderKey}))).map(({appointmentId:t,...r})=>({...r,id:t}))}function De(e,t,r,o,n){let i=new Map;for(let u of e){let d=t?.[String(u.id)];if(d){i.set(u.id,{className:d});continue}let s=r?.(u);if(s){i.set(u.id,s);continue}let c=o.get(u.id);if(c){i.set(u.id,{className:c});continue}let m=n.get(u.id);i.set(u.id,m?{className:m}:void 0);}return i}function Ne({adapter:e,appointments:t,dayEnd:r="18:00",dayStart:o="09:00",resources:n,selectedDate:i}){let u=g__namespace.useMemo(()=>ue(o),[o]),d=g__namespace.useMemo(()=>ue(r),[r]),s=g__namespace.useMemo(()=>Math.max(0,d-u),[d,u]),c=g__namespace.useMemo(()=>12+s*2+24,[s]),m=g__namespace.useMemo(()=>72+Math.max(n.length,1)*420,[n.length]),f=g__namespace.useMemo(()=>de(e),[e]),R=g__namespace.useMemo(()=>J(i),[i]),l=g__namespace.useMemo(()=>Me({adapter:f,appointments:t,dayMinutes:s,dayStartAbs:u,selectedISO:R}),[t,s,u,f,R]);return {appointmentMap:g__namespace.useMemo(()=>ve(l),[l]),dayEndAbs:d,dayMinutes:s,dayStartAbs:u,gridHeight:c,gridMinWidth:m,renderAppts:l}}var Rt=4,ht=(e,t)=>{e(r=>r&&{...r,clientX:t.clientX,clientY:t.clientY});},gt=e=>{let{dragRef:t,pendingDragRef:r,pointer:o,setDrag:n,setMovePreview:i,suppressClickRef:u}=e,d=r.current;if(!d||d.drag.pointerId!==o.pointerId)return;let s=o.clientX-d.startClientX,c=o.clientY-d.startClientY;Math.hypot(s,c)<Rt||(u.current=true,t.current=d.drag,n(d.drag),d.drag.kind==="move"&&i({appointment:d.appointment,clientX:o.clientX,clientY:o.clientY,width:d.width,height:d.height,offsetX:d.offsetX,offsetY:d.offsetY}),r.current=null);},Tt=(e,t,r,o,n)=>{let i=o(t.clientX,e.resourceId),d=n(i,t.clientY)-e.offsetMin,s=w(V(d),0,r-e.durationMin),c=s+e.durationMin;return s===e.startMin&&c===e.endMin&&i===e.resourceId?null:{...e,resourceId:i,startMin:s,endMin:c}},It=(e,t,r,o)=>{let n=o(e.resourceId,t.clientY),i=w(V(n),e.startMin+15,r);return i===e.endMin?null:{...e,endMin:i}},Be=e=>{let{dayMinutes:t,dragRef:r,latestPointerRef:o,pendingDragRef:n,pointerToMin:i,pointerToResourceId:u,setDrag:d,setMovePreview:s,suppressClickRef:c}=e,m=o.current;if(!m)return;let f=r.current;if(f.kind==="none"&&n.current){gt({pointer:m,pendingDragRef:n,setDrag:d,setMovePreview:s,dragRef:r,suppressClickRef:c});return}if(f.kind==="none")return;if(f.kind==="move"){ht(s,m);let l=Tt(f,m,t,u,i);l&&(c.current=true,r.current=l,d(l));return}let R=It(f,m,t,i);R&&(c.current=true,r.current=R,d(R));},Ee=e=>{let{dragRef:t,frameRef:r,latestPointerRef:o,pendingDragRef:n,persistDrag:i,setDrag:u,setMovePreview:d,suppressClickRef:s}=e;r.current!==null&&(window.cancelAnimationFrame(r.current),r.current=null),o.current=null,n.current=null,d(null);let c=t.current;c.kind!=="none"&&(u({kind:"none"}),t.current={kind:"none"},s.current&&i(c));};var Oe=({appointmentMap:e,dayMinutes:t,dayStartAbs:r,onAppointmentChange:o,onPersistMoveResize:n,renderAppts:i,resources:u,selectedDate:d,editable:s})=>{let[c,m]=g__namespace.useState({kind:"none"}),[f,R]=g__namespace.useState(null),l=g__namespace.useRef({}),T=g__namespace.useRef(false),x=g__namespace.useRef({kind:"none"}),b=g__namespace.useRef(null),A=g__namespace.useRef(null),y=g__namespace.useRef(null),$=g__namespace.useMemo(()=>{let p=new Map;for(let a of i){let h=p.get(a.resourceId)??[];h.push(a),p.set(a.resourceId,h);}return p},[i]);g__namespace.useEffect(()=>{x.current=c;},[c]),g__namespace.useEffect(()=>()=>{y.current!==null&&window.cancelAnimationFrame(y.current);},[]);let O=g__namespace.useCallback((p,a)=>{let h=l.current[String(p)];if(!h)return 0;let M=a-h.getBoundingClientRect().top-12;return w(V(M/2),0,t)},[t]),W=g__namespace.useCallback((p,a)=>{for(let h of u){let M=l.current[String(h.id)];if(!M)continue;let L=M.getBoundingClientRect();if(p>=L.left&&p<=L.right)return h.id}return a},[u]),D=g__namespace.useCallback((p,a,h,M)=>($.get(a)??[]).some(K=>K.id!==p&&pe(K,{startMin:h,endMin:M})),[$]),Y=g__namespace.useMemo(()=>c.kind==="none"?false:D(c.appointmentId,c.resourceId,c.startMin,c.endMin),[c,D]),X=g__namespace.useCallback(async p=>{let a=e.get(p.appointmentId);if(!a||D(p.appointmentId,p.resourceId,p.startMin,p.endMin))return;let h={resourceId:p.resourceId,start:z(d,r,p.startMin),end:z(d,r,p.endMin)};if(o){await o({kind:p.kind,appointment:a.raw,resourceId:h.resourceId,start:h.start,end:h.end,previousResourceId:a.resourceId,previousStart:a.start,previousEnd:a.end,previous:{resourceId:a.resourceId,start:a.start,end:a.end},next:h});return}n&&await n({appointment:a.raw,resourceId:h.resourceId,start:h.start,end:h.end});},[e,r,D,o,n,d]),te=g__namespace.useCallback((p,a)=>{if(!s||p.button!==0)return;p.stopPropagation(),T.current=false;let h=p.currentTarget.getBoundingClientRect(),M=O(a.resourceId,p.clientY);b.current={drag:{kind:"move",appointmentId:a.id,pointerId:p.pointerId,resourceId:a.resourceId,durationMin:Math.max(15,a.endMin-a.startMin),offsetMin:M-a.startMin,startMin:a.startMin,endMin:a.endMin},appointment:a,startClientX:p.clientX,startClientY:p.clientY,width:h.width,height:h.height,offsetX:p.clientX-h.left,offsetY:p.clientY-h.top};},[O,s]),G=g__namespace.useCallback((p,a)=>{s&&p.button===0&&(p.stopPropagation(),T.current=false,b.current={drag:{kind:"resize",appointmentId:a.id,pointerId:p.pointerId,resourceId:a.resourceId,startMin:a.startMin,endMin:a.endMin},appointment:a,startClientX:p.clientX,startClientY:p.clientY,width:0,height:0,offsetX:0,offsetY:0});},[s]),re=g__namespace.useCallback(p=>{A.current={clientX:p.clientX,clientY:p.clientY,pointerId:p.pointerId},y.current===null&&(y.current=window.requestAnimationFrame(()=>{y.current=null,Be({dayMinutes:t,dragRef:x,latestPointerRef:A,pendingDragRef:b,pointerToMin:O,pointerToResourceId:W,setDrag:m,setMovePreview:R,suppressClickRef:T});}));},[t,O,W]),S=g__namespace.useCallback(()=>{Ee({dragRef:x,frameRef:y,latestPointerRef:A,pendingDragRef:b,persistDrag:X,setDrag:m,setMovePreview:R,suppressClickRef:T});},[X]);return {colRefs:l,drag:c,isDropInvalid:Y,movePreview:f,onApptPointerDown:te,onGlobalPointerMove:re,onGlobalPointerUp:S,onResizePointerDown:G,suppressClickRef:T}};function Le({appointmentColorTokenClassMap:e,dayStartAbs:t,drag:r,getResourceAppointmentAppearance:o,getResourceAppointmentBackground:n,getResourceAppointmentColorToken:i,renderAppts:u,resourceAppointmentClassMap:d,resources:s,selectedDate:c}){let m=g__namespace.useMemo(()=>Pe(u,r,c,t),[t,r,u,c]),f=g__namespace.useMemo(()=>xe(s,u),[u,s]),R=g__namespace.useMemo(()=>{if(r.kind!=="resize")return f;let b=new Map(f),A=m.filter(y=>y.resourceId===r.resourceId);return b.set(r.resourceId,fe(A)),b},[f,r,m]),l=g__namespace.useMemo(()=>n?le({fallback:void 0,getValue:n,resources:s,toKey:b=>b.id}):new Map,[n,s]),T=g__namespace.useMemo(()=>{if(!i)return new Map;let b={...be,...e??{}};return le({fallback:void 0,getValue:A=>{let y=i(A);return y?b[y]:void 0},resources:s,toKey:A=>A.id})},[e,i,s]);return {appointmentAppearanceByResource:g__namespace.useMemo(()=>De(s,d,o,T,l),[l,T,o,d,s]),appointmentBgByResource:l,effectiveAppts:m,laidOutByResource:R}}function _e({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsxRuntime.jsx("div",{className:"rfs-times rfs:border-border rfs:bg-card",style:{width:72,height:r},children:Array.from({length:Math.floor(e/60)+1}).map((o,n)=>jsxRuntime.jsxs("div",{className:"rfs-time-tick rfs:text-muted-foreground",style:{top:12+n*60*2},children:[String(Math.floor((t+n*60)/60)).padStart(2,"0"),":",String((t+n*60)%60).padStart(2,"0")]},`tick-${n}`))})}function ze({resource:e}){return jsxRuntime.jsx("strong",{children:e.label})}function Xe({resources:e,renderResourceHeader:t}){return jsxRuntime.jsxs("div",{className:"rfs-header rfs:border-border rfs:bg-card",children:[jsxRuntime.jsx("div",{className:"rfs-gutter rfs:border-border",style:{width:72}}),e.map(r=>jsxRuntime.jsxs("div",{className:"rfs-resource-header rfs:border-border rfs:bg-card rfs:text-foreground",style:{minWidth:420,flex:1},children:[(t??(o=>ze({resource:o})))(r),Se(r)?jsxRuntime.jsx("div",{className:"rfs-resource-subtitle rfs:text-muted-foreground",children:Ae(r)}):null]},String(r.id)))]})}var Fe=({resource:e,colRefs:t,gridHeight:r,dayMinutes:o,appointments:n,appointmentAppearance:i,appointmentBg:u,isDropInvalid:d,renderAppointment:s,onApptPointerDown:c,onResizePointerDown:m,drag:f,suppressClickRef:R})=>jsxRuntime.jsx("div",{className:"rfs-col rfs:border-border rfs:bg-card",style:{minWidth:420,flex:1},children:jsxRuntime.jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner rfs:bg-card",style:{height:r},children:[Array.from({length:Math.floor(o/60)+1}).map((l,T)=>jsxRuntime.jsx("div",{className:"rfs-hour-line rfs:border-border/70",style:{top:12+T*60*2}},`major-${T}`)),Array.from({length:Math.floor(o/15)+1}).map((l,T)=>jsxRuntime.jsx("div",{className:"rfs-slot-line rfs:border-border/50",style:{top:12+T*15*2}},`minor-${T}`)),n.map(l=>{let T=100/l.lanes,x=12+l.startMin*2,b=Math.max(30,(l.endMin-l.startMin)*2);return jsxRuntime.jsx("div",{className:`rfs-card-slot ${l.visualState==="ghost"?"rfs-card-slot--ghost":""} ${l.visualState==="dragging"?"rfs-card-slot--dragging":""}`,style:{top:x,left:`${T*l.lane}%`,width:`${T}%`,height:b},children:(s??q)({appointment:l,isDropInvalid:d&&f.kind==="resize"&&l.id===f.appointmentId,onPointerDown:A=>c(A,l),onResizePointerDown:A=>m(A,l),appointmentAppearance:i,appointmentBackgroundColor:u,drag:f,suppressClickRef:R})},l.renderKey)})]})});var Mt=(e,t)=>[e.resource===t.resource,e.colRefs===t.colRefs,e.gridHeight===t.gridHeight,e.dayMinutes===t.dayMinutes,e.appointments===t.appointments,e.appointmentAppearance===t.appointmentAppearance,e.appointmentBg===t.appointmentBg,e.isDropInvalid===t.isDropInvalid,e.renderAppointment===t.renderAppointment,e.onApptPointerDown===t.onApptPointerDown,e.onResizePointerDown===t.onResizePointerDown,e.drag===t.drag,e.suppressClickRef===t.suppressClickRef].every(Boolean),Ue=g__namespace.memo(Fe,Mt);function H(...e){return e.filter(Boolean).join(" ")}var vt={default:"rfs:bg-primary rfs:text-primary-foreground rfs:hover:bg-primary/90",outline:"rfs:border rfs:border-border rfs:bg-card rfs:text-foreground rfs:hover:bg-muted",ghost:"rfs:text-foreground rfs:hover:bg-muted"},Pt={default:"rfs:h-9 rfs:px-4 rfs:py-2",sm:"rfs:h-8 rfs:px-3 rfs:text-xs",icon:"rfs:h-8 rfs:w-8"},P=g__namespace.forwardRef(function({className:t,variant:r="default",size:o="default",type:n="button",...i},u){return jsxRuntime.jsx("button",{ref:u,type:n,className:H("rfs:inline-flex rfs:items-center rfs:justify-center rfs:gap-2 rfs:rounded-md rfs:text-sm rfs:font-medium rfs:whitespace-nowrap rfs:transition-colors rfs:focus-visible:outline-none rfs:focus-visible:ring-2 rfs:focus-visible:ring-ring rfs:focus-visible:ring-offset-2 rfs:disabled:pointer-events-none rfs:disabled:opacity-50",vt[r],Pt[o],t),...i})});function qe({selected:e,onSelect:t}){let[r,o]=g__namespace.useState(e??new Date);g__namespace.useEffect(()=>{e&&o(e);},[e]);let n=dateFns.startOfMonth(r),i=dateFns.startOfWeek(n,{weekStartsOn:1}),u=dateFns.endOfWeek(dateFns.endOfMonth(r),{weekStartsOn:1}),d=[];for(let s=i;s<=u;s=dateFns.addDays(s,1))d.push(s);return jsxRuntime.jsxs("div",{className:"rfs:w-72 rfs:rounded-md rfs:bg-popover",children:[jsxRuntime.jsxs("div",{className:"rfs:mb-2 rfs:flex rfs:items-center rfs:justify-between",children:[jsxRuntime.jsx(P,{variant:"ghost",size:"icon","aria-label":"Previous month",onClick:()=>o(dateFns.addMonths(r,-1)),children:"<"}),jsxRuntime.jsx("div",{className:"rfs:text-sm rfs:font-medium",children:dateFns.format(r,"MMMM yyyy")}),jsxRuntime.jsx(P,{variant:"ghost",size:"icon","aria-label":"Next month",onClick:()=>o(dateFns.addMonths(r,1)),children:">"})]}),jsxRuntime.jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1 rfs:text-center rfs:text-xs rfs:text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(s=>jsxRuntime.jsx("div",{className:"rfs:py-1",children:s},s))}),jsxRuntime.jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1",children:d.map(s=>{let c=e?dateFns.isSameDay(s,e):false;return jsxRuntime.jsx(P,{variant:c?"default":"ghost",size:"icon",className:H("rfs:text-xs",!dateFns.isSameMonth(s,r)&&"rfs:text-muted-foreground rfs:opacity-60",dateFns.isToday(s)&&!c&&"rfs:border rfs:border-border"),onClick:()=>t?.(s),children:dateFns.format(s,"d")},s.toISOString())})})]})}var Je=g__namespace.createContext(null);function Qe(){let e=g__namespace.useContext(Je);if(!e)throw new Error("Popover components must be used within Popover.");return e}function Ze({children:e,open:t,onOpenChange:r}){let[o,n]=g__namespace.useState(false),i=g__namespace.useRef(null),u=g__namespace.useRef(null),d=t??o,s=g__namespace.useCallback(c=>{let m=typeof c=="function"?c(d):c;t===void 0&&n(m),r?.(m);},[t,r,d]);return g__namespace.useEffect(()=>{if(!d)return;let c=f=>{let R=f.target;i.current?.contains(R)||u.current?.contains(R)||s(false);},m=f=>{f.key==="Escape"&&s(false);};return document.addEventListener("mousedown",c),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",c),document.removeEventListener("keydown",m);}},[d,s]),jsxRuntime.jsx(Je.Provider,{value:{open:d,setOpen:s,triggerRef:i,contentRef:u},children:jsxRuntime.jsx("div",{className:"rfs:relative rfs:inline-flex",children:e})})}function je({children:e,asChild:t=false}){let{open:r,setOpen:o,triggerRef:n}=Qe();if(t&&g__namespace.isValidElement(e)){let i=e;return g__namespace.cloneElement(i,{ref:n,"aria-expanded":r,onClick:u=>{i.props.onClick?.(u),o(d=>!d);}})}return jsxRuntime.jsx("button",{ref:n,type:"button","aria-expanded":r,onClick:()=>o(i=>!i),children:e})}function et({children:e,className:t,align:r="start"}){let{open:o,contentRef:n}=Qe();return o?jsxRuntime.jsx("div",{ref:n,className:H("rfs:absolute rfs:top-full rfs:z-50 rfs:mt-2 rfs:min-w-72 rfs:rounded-md rfs:border rfs:border-border rfs:bg-popover rfs:p-2 rfs:text-popover-foreground rfs:shadow-md rfs:outline-none",r==="start"&&"rfs:left-0",r==="center"&&"rfs:left-1/2 rfs:-translate-x-1/2",r==="end"&&"rfs:right-0",t),children:e}):null}function tt({selectedDate:e,onSelectedDateChange:t}){return jsxRuntime.jsxs(Ze,{children:[jsxRuntime.jsx(je,{asChild:true,children:jsxRuntime.jsx(P,{variant:"outline",size:"sm",className:"rfs:min-w-40 rfs:justify-start rfs:text-left rfs:font-normal",children:dateFns.format(e,"PPP")})}),jsxRuntime.jsx(et,{className:"rfs:w-auto rfs:p-2",align:"center",children:jsxRuntime.jsx(qe,{selected:e,onSelect:t})})]})}function rt({goToPreviousDay:e,goToNextDay:t,defaultDatePicker:r,prevButtonLabel:o="Prev",nextButtonLabel:n="Next"}){return jsxRuntime.jsx("div",{className:"rfs-toolbar",children:jsxRuntime.jsxs("div",{className:"rfs:flex rfs:items-center rfs:gap-2 rfs:rounded-lg rfs:border rfs:border-border rfs:bg-card rfs:p-1 rfs:shadow-xs",children:[jsxRuntime.jsx(P,{variant:"outline",size:"sm",onClick:e,children:o}),r,jsxRuntime.jsx(P,{variant:"outline",size:"sm",onClick:t,children:n})]})})}function st({selectedDate:e,onSelectedDateChange:t,prevButtonLabel:r,nextButtonLabel:o,renderToolbar:n,renderDatePicker:i}){let u=()=>t(ce(e,-1)),d=()=>t(ce(e,1)),s=(i??tt)({selectedDate:e,onSelectedDateChange:t});return n?jsxRuntime.jsx(jsxRuntime.Fragment,{children:n({selectedDate:e,onSelectedDateChange:t,goToPreviousDay:u,goToNextDay:d,defaultDatePicker:s})}):jsxRuntime.jsx(jsxRuntime.Fragment,{children:rt({goToPreviousDay:u,goToNextDay:d,defaultDatePicker:s,prevButtonLabel:r,nextButtonLabel:o})})}var Ht={kind:"none"};function Yt({resources:e,appointments:t,selectedDate:r,onSelectedDateChange:o,adapter:n,onPersistMoveResize:i,onAppointmentChange:u,renderResourceHeader:d,renderAppointment:s,resourceAppointmentClassMap:c,getResourceAppointmentAppearance:m,getResourceAppointmentColorToken:f,appointmentColorTokenClassMap:R,getResourceAppointmentBackground:l,renderToolbar:T,renderDatePicker:x,prevButtonLabel:b="Prev",nextButtonLabel:A="Next",dayStart:y="09:00",dayEnd:$="18:00",editable:O=true}){let{appointmentMap:W,dayMinutes:D,dayStartAbs:Y,gridHeight:X,gridMinWidth:te,renderAppts:G}=Ne({adapter:n,appointments:t,dayEnd:$,dayStart:y,resources:e,selectedDate:r}),{colRefs:re,drag:S,isDropInvalid:p,movePreview:a,onApptPointerDown:h,onGlobalPointerMove:M,onGlobalPointerUp:L,onResizePointerDown:K,suppressClickRef:he}=Oe({appointmentMap:W,dayMinutes:D,dayStartAbs:Y,onAppointmentChange:u,onPersistMoveResize:i,renderAppts:G,resources:e,selectedDate:r,editable:O}),{appointmentAppearanceByResource:ne,appointmentBgByResource:oe,laidOutByResource:ut}=Le({appointmentColorTokenClassMap:R,dayStartAbs:Y,drag:S,getResourceAppointmentAppearance:m,getResourceAppointmentBackground:l,getResourceAppointmentColorToken:f,renderAppts:G,resourceAppointmentClassMap:c,resources:e,selectedDate:r}),k=g__namespace.useMemo(()=>S.kind!=="move"||!a?null:{appointment:{...a.appointment,resourceId:S.resourceId,startMin:S.startMin,endMin:S.endMin,visualState:"ghost",renderKey:`${a.appointment.renderKey}-overlay`,lane:0,lanes:1},appearance:ne.get(S.resourceId),background:oe.get(S.resourceId),left:a.clientX-a.offsetX,top:a.clientY-a.offsetY,width:a.width,height:a.height},[ne,oe,S,a]);return jsxRuntime.jsxs("section",{className:`rfs-root rfs:rounded-lg rfs:text-foreground ${S.kind==="move"?"rfs-root--drag-move":""} ${S.kind==="resize"?"rfs-root--drag-resize":""}`,onPointerMove:M,onPointerUp:L,onPointerCancel:L,children:[jsxRuntime.jsx(st,{selectedDate:r,onSelectedDateChange:o,prevButtonLabel:b,nextButtonLabel:A,renderToolbar:T,renderDatePicker:x}),jsxRuntime.jsx("div",{className:"rfs-shell rfs:border-border rfs:bg-card",children:jsxRuntime.jsxs("div",{style:{minWidth:te},children:[jsxRuntime.jsx(Xe,{resources:e,renderResourceHeader:d}),jsxRuntime.jsxs("div",{className:"rfs-body",children:[jsxRuntime.jsx(_e,{dayMinutes:D,dayStartAbs:Y,gridHeight:X}),jsxRuntime.jsx("div",{className:"rfs-grid",children:e.map(_=>jsxRuntime.jsx(Ue,{resource:_,colRefs:re,gridHeight:X,dayMinutes:D,appointments:ut.get(_.id)??[],appointmentAppearance:ne.get(_.id),appointmentBg:oe.get(_.id),isDropInvalid:p,renderAppointment:s,onApptPointerDown:h,onResizePointerDown:K,drag:S.kind==="resize"&&S.resourceId===_.id?S:Ht,suppressClickRef:he},String(_.id)))})]})]})}),k?jsxRuntime.jsx("div",{className:"rfs-drag-overlay",style:{left:k.left,top:k.top,width:k.width,height:k.height},children:(s??q)({appointment:k.appointment,isDropInvalid:p,onPointerDown:()=>{},onResizePointerDown:()=>{},appointmentAppearance:k.appearance,appointmentBackgroundColor:k.background,drag:S,suppressClickRef:he})}):null]})}var dt=(e,t)=>typeof t=="function"?t(e):e[t],Xt=e=>"id"in e,Ft=e=>({resourceId:e.resourceId??e.next.resourceId,start:e.start??e.next.start,end:e.end??e.next.end}),Vt=(e,t,r)=>{let o=Ft(t);return e.map(n=>{if(Xt(r)){if(dt(n,r.id)!==dt(t.appointment,r.id))return n;let d=r.dateValue??(s=>s);return {...n,[r.resourceId]:o.resourceId,[r.start]:d(o.start),[r.end]:d(o.end)}}if(r.getId(n)!==r.getId(t.appointment))return n;let i=r.setResourceId(n,o.resourceId),u=r.setStart(i,o.start);return r.setEnd(u,o.end)})};exports.Scheduler=Yt;exports.applySchedulerAppointmentChange=Vt;exports.resolveSchedulerAppointmentAdapter=de;
package/dist/index.d.cts CHANGED
@@ -8,6 +8,15 @@ type SchedulerAppointmentAdapter<TAppointment, TResourceId extends string | numb
8
8
  getEnd: (item: TAppointment) => Date | string;
9
9
  getTitle: (item: TAppointment) => string;
10
10
  };
11
+ type SchedulerAppointmentField<TAppointment, TValue> = Extract<keyof TAppointment, string | number> | ((item: TAppointment) => TValue);
12
+ type SchedulerAppointmentFieldAdapter<TAppointment, TResourceId extends string | number> = {
13
+ id: SchedulerAppointmentField<TAppointment, number | string>;
14
+ resourceId: SchedulerAppointmentField<TAppointment, TResourceId>;
15
+ start: SchedulerAppointmentField<TAppointment, Date | string>;
16
+ end: SchedulerAppointmentField<TAppointment, Date | string>;
17
+ title: SchedulerAppointmentField<TAppointment, string>;
18
+ };
19
+ type SchedulerAppointmentAdapterInput<TAppointment, TResourceId extends string | number> = SchedulerAppointmentAdapter<TAppointment, TResourceId> | SchedulerAppointmentFieldAdapter<TAppointment, TResourceId>;
11
20
  type SchedulerId = string | number;
12
21
  type BaseSchedulerResource<TId extends SchedulerId = number> = {
13
22
  id: TId;
@@ -51,6 +60,12 @@ type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = Schedu
51
60
  type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerId> = {
52
61
  kind: "move" | "resize";
53
62
  appointment: TAppointment;
63
+ resourceId?: TResourceId;
64
+ start?: Date;
65
+ end?: Date;
66
+ previousResourceId?: TResourceId;
67
+ previousStart?: Date;
68
+ previousEnd?: Date;
54
69
  previous: {
55
70
  resourceId: TResourceId;
56
71
  start: Date;
@@ -62,6 +77,14 @@ type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerI
62
77
  end: Date;
63
78
  };
64
79
  };
80
+ type SchedulerAppointmentChangeEvent<TAppointment, TResourceId extends SchedulerId> = SchedulerAppointmentChangeArgs<TAppointment, TResourceId> & {
81
+ resourceId: TResourceId;
82
+ start: Date;
83
+ end: Date;
84
+ previousResourceId: TResourceId;
85
+ previousStart: Date;
86
+ previousEnd: Date;
87
+ };
65
88
  type SchedulerAppointmentAppearance = {
66
89
  className?: string;
67
90
  };
@@ -79,14 +102,14 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
79
102
  appointments: TAppointment[];
80
103
  selectedDate: Date;
81
104
  onSelectedDateChange: (date: Date) => void;
82
- adapter: SchedulerAppointmentAdapter<TAppointment, TResourceId>;
105
+ adapter: SchedulerAppointmentAdapterInput<TAppointment, TResourceId>;
83
106
  onPersistMoveResize?: (args: {
84
107
  appointment: TAppointment;
85
108
  resourceId: TResourceId;
86
109
  start: Date;
87
110
  end: Date;
88
111
  }) => Promise<void> | void;
89
- onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
112
+ onAppointmentChange?: (args: SchedulerAppointmentChangeEvent<TAppointment, TResourceId>) => Promise<void> | void;
90
113
  renderResourceHeader?: (resource: TResource) => React.ReactNode;
91
114
  renderAppointment?: (args: {
92
115
  appointment: SchedulerPresentationAppointment<TAppointment, TResourceId> & {
@@ -115,9 +138,12 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
115
138
  nextButtonLabel?: React.ReactNode;
116
139
  dayStart?: string;
117
140
  dayEnd?: string;
141
+ editable?: boolean;
118
142
  };
119
143
 
120
- declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
144
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, editable }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
145
+
146
+ declare const resolveSchedulerAppointmentAdapter: <TAppointment, TResourceId extends string | number>(adapter: SchedulerAppointmentAdapterInput<TAppointment, TResourceId>) => SchedulerAppointmentAdapter<TAppointment, TResourceId>;
121
147
 
122
148
  type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
123
149
  getId: (appointment: TAppointment) => SchedulerId;
@@ -125,6 +151,14 @@ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends Sc
125
151
  setStart: (appointment: TAppointment, start: Date) => TAppointment;
126
152
  setEnd: (appointment: TAppointment, end: Date) => TAppointment;
127
153
  };
128
- declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
154
+ type ApplySchedulerAppointmentChangeFieldOptions<TAppointment> = {
155
+ id: SchedulerAppointmentField<TAppointment, SchedulerId>;
156
+ resourceId: Extract<keyof TAppointment, string | number>;
157
+ start: Extract<keyof TAppointment, string | number>;
158
+ end: Extract<keyof TAppointment, string | number>;
159
+ dateValue?: (date: Date) => unknown;
160
+ };
161
+ type ApplySchedulerAppointmentChangeInput<TAppointment, TResourceId extends SchedulerId> = ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId> | ApplySchedulerAppointmentChangeFieldOptions<TAppointment>;
162
+ declare const applySchedulerAppointmentChange: <TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeInput<TAppointment, TResourceId>) => TAppointment[];
129
163
 
130
- export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
164
+ export { type ApplySchedulerAppointmentChangeFieldOptions, type ApplySchedulerAppointmentChangeInput, type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAdapterInput, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentChangeEvent, type SchedulerAppointmentColorToken, type SchedulerAppointmentField, type SchedulerAppointmentFieldAdapter, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange, resolveSchedulerAppointmentAdapter };
package/dist/index.d.ts CHANGED
@@ -8,6 +8,15 @@ type SchedulerAppointmentAdapter<TAppointment, TResourceId extends string | numb
8
8
  getEnd: (item: TAppointment) => Date | string;
9
9
  getTitle: (item: TAppointment) => string;
10
10
  };
11
+ type SchedulerAppointmentField<TAppointment, TValue> = Extract<keyof TAppointment, string | number> | ((item: TAppointment) => TValue);
12
+ type SchedulerAppointmentFieldAdapter<TAppointment, TResourceId extends string | number> = {
13
+ id: SchedulerAppointmentField<TAppointment, number | string>;
14
+ resourceId: SchedulerAppointmentField<TAppointment, TResourceId>;
15
+ start: SchedulerAppointmentField<TAppointment, Date | string>;
16
+ end: SchedulerAppointmentField<TAppointment, Date | string>;
17
+ title: SchedulerAppointmentField<TAppointment, string>;
18
+ };
19
+ type SchedulerAppointmentAdapterInput<TAppointment, TResourceId extends string | number> = SchedulerAppointmentAdapter<TAppointment, TResourceId> | SchedulerAppointmentFieldAdapter<TAppointment, TResourceId>;
11
20
  type SchedulerId = string | number;
12
21
  type BaseSchedulerResource<TId extends SchedulerId = number> = {
13
22
  id: TId;
@@ -51,6 +60,12 @@ type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = Schedu
51
60
  type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerId> = {
52
61
  kind: "move" | "resize";
53
62
  appointment: TAppointment;
63
+ resourceId?: TResourceId;
64
+ start?: Date;
65
+ end?: Date;
66
+ previousResourceId?: TResourceId;
67
+ previousStart?: Date;
68
+ previousEnd?: Date;
54
69
  previous: {
55
70
  resourceId: TResourceId;
56
71
  start: Date;
@@ -62,6 +77,14 @@ type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerI
62
77
  end: Date;
63
78
  };
64
79
  };
80
+ type SchedulerAppointmentChangeEvent<TAppointment, TResourceId extends SchedulerId> = SchedulerAppointmentChangeArgs<TAppointment, TResourceId> & {
81
+ resourceId: TResourceId;
82
+ start: Date;
83
+ end: Date;
84
+ previousResourceId: TResourceId;
85
+ previousStart: Date;
86
+ previousEnd: Date;
87
+ };
65
88
  type SchedulerAppointmentAppearance = {
66
89
  className?: string;
67
90
  };
@@ -79,14 +102,14 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
79
102
  appointments: TAppointment[];
80
103
  selectedDate: Date;
81
104
  onSelectedDateChange: (date: Date) => void;
82
- adapter: SchedulerAppointmentAdapter<TAppointment, TResourceId>;
105
+ adapter: SchedulerAppointmentAdapterInput<TAppointment, TResourceId>;
83
106
  onPersistMoveResize?: (args: {
84
107
  appointment: TAppointment;
85
108
  resourceId: TResourceId;
86
109
  start: Date;
87
110
  end: Date;
88
111
  }) => Promise<void> | void;
89
- onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
112
+ onAppointmentChange?: (args: SchedulerAppointmentChangeEvent<TAppointment, TResourceId>) => Promise<void> | void;
90
113
  renderResourceHeader?: (resource: TResource) => React.ReactNode;
91
114
  renderAppointment?: (args: {
92
115
  appointment: SchedulerPresentationAppointment<TAppointment, TResourceId> & {
@@ -115,9 +138,12 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
115
138
  nextButtonLabel?: React.ReactNode;
116
139
  dayStart?: string;
117
140
  dayEnd?: string;
141
+ editable?: boolean;
118
142
  };
119
143
 
120
- declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
144
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, editable }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
145
+
146
+ declare const resolveSchedulerAppointmentAdapter: <TAppointment, TResourceId extends string | number>(adapter: SchedulerAppointmentAdapterInput<TAppointment, TResourceId>) => SchedulerAppointmentAdapter<TAppointment, TResourceId>;
121
147
 
122
148
  type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
123
149
  getId: (appointment: TAppointment) => SchedulerId;
@@ -125,6 +151,14 @@ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends Sc
125
151
  setStart: (appointment: TAppointment, start: Date) => TAppointment;
126
152
  setEnd: (appointment: TAppointment, end: Date) => TAppointment;
127
153
  };
128
- declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
154
+ type ApplySchedulerAppointmentChangeFieldOptions<TAppointment> = {
155
+ id: SchedulerAppointmentField<TAppointment, SchedulerId>;
156
+ resourceId: Extract<keyof TAppointment, string | number>;
157
+ start: Extract<keyof TAppointment, string | number>;
158
+ end: Extract<keyof TAppointment, string | number>;
159
+ dateValue?: (date: Date) => unknown;
160
+ };
161
+ type ApplySchedulerAppointmentChangeInput<TAppointment, TResourceId extends SchedulerId> = ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId> | ApplySchedulerAppointmentChangeFieldOptions<TAppointment>;
162
+ declare const applySchedulerAppointmentChange: <TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeInput<TAppointment, TResourceId>) => TAppointment[];
129
163
 
130
- export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
164
+ export { type ApplySchedulerAppointmentChangeFieldOptions, type ApplySchedulerAppointmentChangeInput, type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAdapterInput, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentChangeEvent, type SchedulerAppointmentColorToken, type SchedulerAppointmentField, type SchedulerAppointmentFieldAdapter, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange, resolveSchedulerAppointmentAdapter };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {format,startOfMonth,startOfWeek,endOfWeek,endOfMonth,addDays,addMonths,isSameDay,isToday,isSameMonth}from'date-fns';import*as h from'react';function G({appointment:e,isDropInvalid:t,onPointerDown:r,onResizePointerDown:s,appointmentAppearance:o,appointmentBackgroundColor:i}){let c=e.raw,a=typeof c.description=="string"?c.description:void 0,n=typeof i=="string"?i:void 0,d=o?.className??n??"rfs:bg-muted/40 rfs:dark:bg-muted/30",m=t?"rfs:bg-red-100/80 rfs:text-red-950 rfs:dark:bg-red-950/40 rfs:dark:text-red-100":"",p=e.visualState==="ghost"?"rfs:cursor-grab rfs:opacity-35":e.visualState==="dragging"?"rfs:cursor-grabbing rfs:opacity-55 rfs:shadow-xl":"rfs:cursor-grab",R=`rfs:relative rfs:h-full rfs:overflow-hidden rfs:rounded-md rfs:p-2 rfs:pb-5 rfs:text-foreground ${d} ${m} ${p}`;return jsxs("div",{onPointerDown:r,className:R,children:[t?jsx("div",{className:"rfs:absolute rfs:right-1 rfs:top-1 rfs:flex rfs:h-4 rfs:w-4 rfs:items-center rfs:justify-center rfs:rounded-full rfs:bg-red-600 rfs:text-[10px] rfs:font-bold rfs:text-white",children:"X"}):null,jsx("div",{className:"rfs:text-xs rfs:font-semibold",children:e.title}),a?jsx("div",{className:"rfs:mt-1 rfs:text-[10px] rfs:font-medium rfs:text-muted-foreground",children:a}):null,jsx("div",{role:"button","aria-label":"Resize appointment",onPointerDown:l=>{e.visualState!=="ghost"&&(l.stopPropagation(),s(l));},className:"rfs:absolute rfs:inset-x-1 rfs:bottom-1 rfs:h-2 rfs:cursor-ns-resize rfs:rounded-full rfs:bg-border/90 rfs:transition-colors rfs:hover:bg-border"})]})}function fe(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var me={slate:"bg-slate-100 dark:bg-slate-900/40",gray:"bg-gray-100 dark:bg-gray-900/40",zinc:"bg-zinc-100 dark:bg-zinc-900/40",neutral:"bg-neutral-100 dark:bg-neutral-900/40",stone:"bg-stone-100 dark:bg-stone-900/40",red:"bg-red-100 dark:bg-red-950/40",orange:"bg-orange-100 dark:bg-orange-950/40",amber:"bg-amber-100 dark:bg-amber-950/40",yellow:"bg-yellow-100 dark:bg-yellow-950/40",lime:"bg-lime-100 dark:bg-lime-950/40",green:"bg-green-100 dark:bg-green-950/40",emerald:"bg-emerald-100 dark:bg-emerald-950/40",teal:"bg-teal-100 dark:bg-teal-950/40",cyan:"bg-cyan-100 dark:bg-cyan-950/40",sky:"bg-sky-100 dark:bg-sky-950/40",blue:"bg-blue-100 dark:bg-blue-950/40",indigo:"bg-indigo-100 dark:bg-indigo-950/40",violet:"bg-violet-100 dark:bg-violet-950/40",purple:"bg-purple-100 dark:bg-purple-950/40",fuchsia:"bg-fuchsia-100 dark:bg-fuchsia-950/40",pink:"bg-pink-100 dark:bg-pink-950/40",rose:"bg-rose-100 dark:bg-rose-950/40"};function D(e,t,r){return Math.max(t,Math.min(r,e))}function X(e,t=15){return Math.round(e/t)*t}function ne(e){let[t,r]=e.split(":").map(Number);return t*60+r}function Re(e){return `${e.firstName??""} ${e.lastName??""}`.trim()}function K(e){return format(e,"yyyy-MM-dd")}function oe(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function _(e,t,r){let s=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),o=t+r,i=Math.floor(o/60),c=o%60;return s.setHours(i,c,0,0),s}function se(e,t){return t.getHours()*60+t.getMinutes()-e}function ie(e,t){return e.startMin<t.endMin&&t.startMin<e.endMin}function ge(e){let t=[...e].sort((c,a)=>c.startMin-a.startMin||c.endMin-a.endMin),r=[],s=[],o=[];for(let c of t)s=s.filter(n=>n.endMin>c.startMin),!s.some(n=>ie(n,c))&&o.length>0&&(r.push(o),o=[]),o.push(c),s.push(c);o.length&&r.push(o);let i=[];for(let c of r){let a=[...c].sort((p,R)=>p.startMin-R.startMin||p.endMin-R.endMin),n=[],d=new Map;for(let p of a){let R=false;for(let l=0;l<n.length;l++)if(n[l]<=p.startMin){n[l]=p.endMin,d.set(p.id,l),R=true;break}R||(n.push(p.endMin),d.set(p.id,n.length-1));}let m=n.length;for(let p of a)i.push({...p,lane:d.get(p.id)??0,lanes:m});}return i}function ae({fallback:e,getValue:t,resources:r,toKey:s}){let o=new Map;for(let i of r)o.set(s(i),t(i)??e);return o}function he({adapter:e,appointments:t,dayMinutes:r,dayStartAbs:s,selectedISO:o}){return t.map(i=>{let c=new Date(e.getStart(i)),a=new Date(e.getEnd(i));return {raw:i,id:e.getId(i),resourceId:e.getResourceId(i),start:c,end:a,startMin:D(se(s,c),0,r),endMin:D(se(s,a),0,r),title:e.getTitle(i),renderKey:String(e.getId(i)),visualState:"normal"}}).filter(i=>K(i.start)===o)}function Te(e){return new Map(e.map(t=>[t.id,t]))}function be(e,t,r,s){return t.kind==="none"||t.kind==="move"?e:e.map(o=>o.id!==t.appointmentId?o:{...o,resourceId:t.resourceId,startMin:t.startMin,endMin:t.endMin,start:_(r,s,t.startMin),end:_(r,s,t.endMin),visualState:"dragging"})}function Se(e,t){let r=new Map;for(let o of t){let i=r.get(o.resourceId)??[];i.push(o),r.set(o.resourceId,i);}let s=new Map;for(let o of e)s.set(o.id,ce(r.get(o.id)??[]));return s}function ce(e){return ge(e.map(t=>({...t,appointmentId:t.id,id:t.renderKey}))).map(({appointmentId:t,...r})=>({...r,id:t}))}function Ie(e,t,r,s,o){let i=new Map;for(let c of e){let a=t?.[String(c.id)];if(a){i.set(c.id,{className:a});continue}let n=r?.(c);if(n){i.set(c.id,n);continue}let d=s.get(c.id);if(d){i.set(c.id,{className:d});continue}let m=o.get(c.id);i.set(c.id,m?{className:m}:void 0);}return i}function Ae({adapter:e,appointments:t,dayEnd:r="18:00",dayStart:s="09:00",resources:o,selectedDate:i}){let c=h.useMemo(()=>ne(s),[s]),a=h.useMemo(()=>ne(r),[r]),n=h.useMemo(()=>Math.max(0,a-c),[a,c]),d=h.useMemo(()=>12+n*2+24,[n]),m=h.useMemo(()=>72+Math.max(o.length,1)*420,[o.length]),p=h.useMemo(()=>K(i),[i]),R=h.useMemo(()=>he({adapter:e,appointments:t,dayMinutes:n,dayStartAbs:c,selectedISO:p}),[e,t,n,c,p]);return {appointmentMap:h.useMemo(()=>Te(R),[R]),dayEndAbs:a,dayMinutes:n,dayStartAbs:c,gridHeight:d,gridMinWidth:m,renderAppts:R}}var ot=4,st=(e,t)=>{e(r=>r&&{...r,clientX:t.clientX,clientY:t.clientY});},it=e=>{let{dragRef:t,pendingDragRef:r,pointer:s,setDrag:o,setMovePreview:i,suppressClickRef:c}=e,a=r.current;if(!a||a.drag.pointerId!==s.pointerId)return;let n=s.clientX-a.startClientX,d=s.clientY-a.startClientY;Math.hypot(n,d)<ot||(c.current=true,t.current=a.drag,o(a.drag),a.drag.kind==="move"&&i({appointment:a.appointment,clientX:s.clientX,clientY:s.clientY,width:a.width,height:a.height,offsetX:a.offsetX,offsetY:a.offsetY}),r.current=null);},at=(e,t,r,s,o)=>{let i=s(t.clientX,e.resourceId),a=o(i,t.clientY)-e.offsetMin,n=D(X(a),0,r-e.durationMin),d=n+e.durationMin;return n===e.startMin&&d===e.endMin&&i===e.resourceId?null:{...e,resourceId:i,startMin:n,endMin:d}},ct=(e,t,r,s)=>{let o=s(e.resourceId,t.clientY),i=D(X(o),e.startMin+15,r);return i===e.endMin?null:{...e,endMin:i}},Pe=e=>{let{dayMinutes:t,dragRef:r,latestPointerRef:s,pendingDragRef:o,pointerToMin:i,pointerToResourceId:c,setDrag:a,setMovePreview:n,suppressClickRef:d}=e,m=s.current;if(!m)return;let p=r.current;if(p.kind==="none"&&o.current){it({pointer:m,pendingDragRef:o,setDrag:a,setMovePreview:n,dragRef:r,suppressClickRef:d});return}if(p.kind==="none")return;if(p.kind==="move"){st(n,m);let l=at(p,m,t,c,i);l&&(d.current=true,r.current=l,a(l));return}let R=ct(p,m,t,i);R&&(d.current=true,r.current=R,a(R));},xe=e=>{let{dragRef:t,frameRef:r,latestPointerRef:s,pendingDragRef:o,persistDrag:i,setDrag:c,setMovePreview:a,suppressClickRef:n}=e;r.current!==null&&(window.cancelAnimationFrame(r.current),r.current=null),s.current=null,o.current=null,a(null);let d=t.current;d.kind!=="none"&&(c({kind:"none"}),t.current={kind:"none"},n.current&&i(d));};var De=({appointmentMap:e,dayMinutes:t,dayStartAbs:r,onAppointmentChange:s,onPersistMoveResize:o,renderAppts:i,resources:c,selectedDate:a})=>{let[n,d]=h.useState({kind:"none"}),[m,p]=h.useState(null),R=h.useRef({}),l=h.useRef(false),b=h.useRef({kind:"none"}),A=h.useRef(null),I=h.useRef(null),T=h.useRef(null);h.useEffect(()=>{b.current=n;},[n]),h.useEffect(()=>()=>{T.current!==null&&window.cancelAnimationFrame(T.current);},[]);let M=h.useCallback((u,f)=>{let g=R.current[String(u)];if(!g)return 0;let y=f-g.getBoundingClientRect().top-12;return D(X(y/2),0,t)},[t]),V=h.useCallback((u,f)=>{for(let g of c){let y=R.current[String(g.id)];if(!y)continue;let Y=y.getBoundingClientRect();if(u>=Y.left&&u<=Y.right)return g.id}return f},[c]),E=h.useCallback((u,f,g,y)=>i.filter(k=>k.resourceId===f&&k.id!==u).some(k=>ie(k,{startMin:g,endMin:y})),[i]),z=h.useMemo(()=>n.kind==="none"?false:E(n.appointmentId,n.resourceId,n.startMin,n.endMin),[n,E]),O=h.useCallback(async u=>{let f=e.get(u.appointmentId);if(!f||E(u.appointmentId,u.resourceId,u.startMin,u.endMin))return;let g={resourceId:u.resourceId,start:_(a,r,u.startMin),end:_(a,r,u.endMin)};if(s){await s({kind:u.kind,appointment:f.raw,previous:{resourceId:f.resourceId,start:f.start,end:f.end},next:g});return}o&&await o({appointment:f.raw,resourceId:g.resourceId,start:g.start,end:g.end});},[e,r,E,s,o,a]),$=h.useCallback((u,f)=>{if(u.button!==0)return;u.stopPropagation(),l.current=false;let g=u.currentTarget.getBoundingClientRect(),y=M(f.resourceId,u.clientY);A.current={drag:{kind:"move",appointmentId:f.id,pointerId:u.pointerId,resourceId:f.resourceId,durationMin:Math.max(15,f.endMin-f.startMin),offsetMin:y-f.startMin,startMin:f.startMin,endMin:f.endMin},appointment:f,startClientX:u.clientX,startClientY:u.clientY,width:g.width,height:g.height,offsetX:u.clientX-g.left,offsetY:u.clientY-g.top};},[M]),j=h.useCallback((u,f)=>{u.button===0&&(u.stopPropagation(),l.current=false,A.current={drag:{kind:"resize",appointmentId:f.id,pointerId:u.pointerId,resourceId:f.resourceId,startMin:f.startMin,endMin:f.endMin},appointment:f,startClientX:u.clientX,startClientY:u.clientY,width:0,height:0,offsetX:0,offsetY:0});},[]),F=h.useCallback(u=>{I.current={clientX:u.clientX,clientY:u.clientY,pointerId:u.pointerId},T.current===null&&(T.current=window.requestAnimationFrame(()=>{T.current=null,Pe({dayMinutes:t,dragRef:b,latestPointerRef:I,pendingDragRef:A,pointerToMin:M,pointerToResourceId:V,setDrag:d,setMovePreview:p,suppressClickRef:l});}));},[t,M,V]),ee=h.useCallback(()=>{xe({dragRef:b,frameRef:T,latestPointerRef:I,pendingDragRef:A,persistDrag:O,setDrag:d,setMovePreview:p,suppressClickRef:l});},[O]);return {colRefs:R,drag:n,isDropInvalid:z,movePreview:m,onApptPointerDown:$,onGlobalPointerMove:F,onGlobalPointerUp:ee,onResizePointerDown:j,suppressClickRef:l}};function ke({appointmentColorTokenClassMap:e,dayStartAbs:t,drag:r,getResourceAppointmentAppearance:s,getResourceAppointmentBackground:o,getResourceAppointmentColorToken:i,renderAppts:c,resourceAppointmentClassMap:a,resources:n,selectedDate:d}){let m=h.useMemo(()=>be(c,r,d,t),[t,r,c,d]),p=h.useMemo(()=>Se(n,c),[c,n]),R=h.useMemo(()=>{if(r.kind!=="resize")return p;let I=new Map(p),T=m.filter(M=>M.resourceId===r.resourceId);return I.set(r.resourceId,ce(T)),I},[p,r,m]),l=h.useMemo(()=>o?ae({fallback:void 0,getValue:o,resources:n,toKey:I=>I.id}):new Map,[o,n]),b=h.useMemo(()=>{if(!i)return new Map;let I={...me,...e??{}};return ae({fallback:void 0,getValue:T=>{let M=i(T);return M?I[M]:void 0},resources:n,toKey:T=>T.id})},[e,i,n]);return {appointmentAppearanceByResource:h.useMemo(()=>Ie(n,a,s,b,l),[l,b,s,a,n]),appointmentBgByResource:l,effectiveAppts:m,laidOutByResource:R}}function we({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsx("div",{className:"rfs-times rfs:border-border rfs:bg-card",style:{width:72,height:r},children:Array.from({length:Math.floor(e/60)+1}).map((s,o)=>jsxs("div",{className:"rfs-time-tick rfs:text-muted-foreground",style:{top:12+o*60*2},children:[String(Math.floor((t+o*60)/60)).padStart(2,"0"),":",String((t+o*60)%60).padStart(2,"0")]},`tick-${o}`))})}function Ne({resource:e}){return jsx("strong",{children:e.label})}function Ee({resources:e,renderResourceHeader:t}){return jsxs("div",{className:"rfs-header rfs:border-border rfs:bg-card",children:[jsx("div",{className:"rfs-gutter rfs:border-border",style:{width:72}}),e.map(r=>jsxs("div",{className:"rfs-resource-header rfs:border-border rfs:bg-card rfs:text-foreground",style:{minWidth:420,flex:1},children:[(t??(s=>Ne({resource:s})))(r),fe(r)?jsx("div",{className:"rfs-resource-subtitle rfs:text-muted-foreground",children:Re(r)}):null]},String(r.id)))]})}var Oe=({resource:e,colRefs:t,gridHeight:r,dayMinutes:s,appointments:o,appointmentAppearance:i,appointmentBg:c,isDropInvalid:a,renderAppointment:n,onApptPointerDown:d,onResizePointerDown:m,drag:p,suppressClickRef:R})=>jsx("div",{className:"rfs-col rfs:border-border rfs:bg-card",style:{minWidth:420,flex:1},children:jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner rfs:bg-card",style:{height:r},children:[Array.from({length:Math.floor(s/60)+1}).map((l,b)=>jsx("div",{className:"rfs-hour-line rfs:border-border/70",style:{top:12+b*60*2}},`major-${b}`)),Array.from({length:Math.floor(s/15)+1}).map((l,b)=>jsx("div",{className:"rfs-slot-line rfs:border-border/50",style:{top:12+b*15*2}},`minor-${b}`)),o.map(l=>{let b=100/l.lanes,A=12+l.startMin*2,I=Math.max(30,(l.endMin-l.startMin)*2);return jsx("div",{className:`rfs-card-slot ${l.visualState==="ghost"?"rfs-card-slot--ghost":""} ${l.visualState==="dragging"?"rfs-card-slot--dragging":""}`,style:{top:A,left:`${b*l.lane}%`,width:`${b}%`,height:I},children:(n??G)({appointment:l,isDropInvalid:a&&p.kind==="resize"&&l.id===p.appointmentId,onPointerDown:T=>d(T,l),onResizePointerDown:T=>m(T,l),appointmentAppearance:i,appointmentBackgroundColor:c,drag:p,suppressClickRef:R})},l.renderKey)})]})});var ft=(e,t)=>[e.resource===t.resource,e.colRefs===t.colRefs,e.gridHeight===t.gridHeight,e.dayMinutes===t.dayMinutes,e.appointments===t.appointments,e.appointmentAppearance===t.appointmentAppearance,e.appointmentBg===t.appointmentBg,e.isDropInvalid===t.isDropInvalid,e.renderAppointment===t.renderAppointment,e.onApptPointerDown===t.onApptPointerDown,e.onResizePointerDown===t.onResizePointerDown,e.drag===t.drag,e.suppressClickRef===t.suppressClickRef].every(Boolean),_e=h.memo(Oe,ft);function H(...e){return e.filter(Boolean).join(" ")}var mt={default:"rfs:bg-primary rfs:text-primary-foreground rfs:hover:bg-primary/90",outline:"rfs:border rfs:border-border rfs:bg-card rfs:text-foreground rfs:hover:bg-muted",ghost:"rfs:text-foreground rfs:hover:bg-muted"},Rt={default:"rfs:h-9 rfs:px-4 rfs:py-2",sm:"rfs:h-8 rfs:px-3 rfs:text-xs",icon:"rfs:h-8 rfs:w-8"},P=h.forwardRef(function({className:t,variant:r="default",size:s="default",type:o="button",...i},c){return jsx("button",{ref:c,type:o,className:H("rfs:inline-flex rfs:items-center rfs:justify-center rfs:gap-2 rfs:rounded-md rfs:text-sm rfs:font-medium rfs:whitespace-nowrap rfs:transition-colors rfs:focus-visible:outline-none rfs:focus-visible:ring-2 rfs:focus-visible:ring-ring rfs:focus-visible:ring-offset-2 rfs:disabled:pointer-events-none rfs:disabled:opacity-50",mt[r],Rt[s],t),...i})});function Ue({selected:e,onSelect:t}){let[r,s]=h.useState(e??new Date);h.useEffect(()=>{e&&s(e);},[e]);let o=startOfMonth(r),i=startOfWeek(o,{weekStartsOn:1}),c=endOfWeek(endOfMonth(r),{weekStartsOn:1}),a=[];for(let n=i;n<=c;n=addDays(n,1))a.push(n);return jsxs("div",{className:"rfs:w-72 rfs:rounded-md rfs:bg-popover",children:[jsxs("div",{className:"rfs:mb-2 rfs:flex rfs:items-center rfs:justify-between",children:[jsx(P,{variant:"ghost",size:"icon","aria-label":"Previous month",onClick:()=>s(addMonths(r,-1)),children:"<"}),jsx("div",{className:"rfs:text-sm rfs:font-medium",children:format(r,"MMMM yyyy")}),jsx(P,{variant:"ghost",size:"icon","aria-label":"Next month",onClick:()=>s(addMonths(r,1)),children:">"})]}),jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1 rfs:text-center rfs:text-xs rfs:text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(n=>jsx("div",{className:"rfs:py-1",children:n},n))}),jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1",children:a.map(n=>{let d=e?isSameDay(n,e):false;return jsx(P,{variant:d?"default":"ghost",size:"icon",className:H("rfs:text-xs",!isSameMonth(n,r)&&"rfs:text-muted-foreground rfs:opacity-60",isToday(n)&&!d&&"rfs:border rfs:border-border"),onClick:()=>t?.(n),children:format(n,"d")},n.toISOString())})})]})}var Ve=h.createContext(null);function $e(){let e=h.useContext(Ve);if(!e)throw new Error("Popover components must be used within Popover.");return e}function Fe({children:e,open:t,onOpenChange:r}){let[s,o]=h.useState(false),i=h.useRef(null),c=h.useRef(null),a=t??s,n=h.useCallback(d=>{let m=typeof d=="function"?d(a):d;t===void 0&&o(m),r?.(m);},[t,r,a]);return h.useEffect(()=>{if(!a)return;let d=p=>{let R=p.target;i.current?.contains(R)||c.current?.contains(R)||n(false);},m=p=>{p.key==="Escape"&&n(false);};return document.addEventListener("mousedown",d),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",d),document.removeEventListener("keydown",m);}},[a,n]),jsx(Ve.Provider,{value:{open:a,setOpen:n,triggerRef:i,contentRef:c},children:jsx("div",{className:"rfs:relative rfs:inline-flex",children:e})})}function We({children:e,asChild:t=false}){let{open:r,setOpen:s,triggerRef:o}=$e();if(t&&h.isValidElement(e)){let i=e;return h.cloneElement(i,{ref:o,"aria-expanded":r,onClick:c=>{i.props.onClick?.(c),s(a=>!a);}})}return jsx("button",{ref:o,type:"button","aria-expanded":r,onClick:()=>s(i=>!i),children:e})}function Ge({children:e,className:t,align:r="start"}){let{open:s,contentRef:o}=$e();return s?jsx("div",{ref:o,className:H("rfs:absolute rfs:top-full rfs:z-50 rfs:mt-2 rfs:min-w-72 rfs:rounded-md rfs:border rfs:border-border rfs:bg-popover rfs:p-2 rfs:text-popover-foreground rfs:shadow-md rfs:outline-none",r==="start"&&"rfs:left-0",r==="center"&&"rfs:left-1/2 rfs:-translate-x-1/2",r==="end"&&"rfs:right-0",t),children:e}):null}function Ke({selectedDate:e,onSelectedDateChange:t}){return jsxs(Fe,{children:[jsx(We,{asChild:true,children:jsx(P,{variant:"outline",size:"sm",className:"rfs:min-w-40 rfs:justify-start rfs:text-left rfs:font-normal",children:format(e,"PPP")})}),jsx(Ge,{className:"rfs:w-auto rfs:p-2",align:"center",children:jsx(Ue,{selected:e,onSelect:t})})]})}function qe({goToPreviousDay:e,goToNextDay:t,defaultDatePicker:r,prevButtonLabel:s="Prev",nextButtonLabel:o="Next"}){return jsx("div",{className:"rfs-toolbar",children:jsxs("div",{className:"rfs:flex rfs:items-center rfs:gap-2 rfs:rounded-lg rfs:border rfs:border-border rfs:bg-card rfs:p-1 rfs:shadow-xs",children:[jsx(P,{variant:"outline",size:"sm",onClick:e,children:s}),r,jsx(P,{variant:"outline",size:"sm",onClick:t,children:o})]})})}function Ze({selectedDate:e,onSelectedDateChange:t,prevButtonLabel:r,nextButtonLabel:s,renderToolbar:o,renderDatePicker:i}){let c=()=>t(oe(e,-1)),a=()=>t(oe(e,1)),n=(i??Ke)({selectedDate:e,onSelectedDateChange:t});return o?jsx(Fragment,{children:o({selectedDate:e,onSelectedDateChange:t,goToPreviousDay:c,goToNextDay:a,defaultDatePicker:n})}):jsx(Fragment,{children:qe({goToPreviousDay:c,goToNextDay:a,defaultDatePicker:n,prevButtonLabel:r,nextButtonLabel:s})})}var Dt={kind:"none"};function kt({resources:e,appointments:t,selectedDate:r,onSelectedDateChange:s,adapter:o,onPersistMoveResize:i,onAppointmentChange:c,renderResourceHeader:a,renderAppointment:n,resourceAppointmentClassMap:d,getResourceAppointmentAppearance:m,getResourceAppointmentColorToken:p,appointmentColorTokenClassMap:R,getResourceAppointmentBackground:l,renderToolbar:b,renderDatePicker:A,prevButtonLabel:I="Prev",nextButtonLabel:T="Next",dayStart:M="09:00",dayEnd:V="18:00"}){let{appointmentMap:E,dayMinutes:z,dayStartAbs:O,gridHeight:$,gridMinWidth:j,renderAppts:F}=Ae({adapter:o,appointments:t,dayEnd:V,dayStart:M,resources:e,selectedDate:r}),{colRefs:ee,drag:u,isDropInvalid:f,movePreview:g,onApptPointerDown:y,onGlobalPointerMove:Y,onGlobalPointerUp:k,onResizePointerDown:et,suppressClickRef:le}=De({appointmentMap:E,dayMinutes:z,dayStartAbs:O,onAppointmentChange:c,onPersistMoveResize:i,renderAppts:F,resources:e,selectedDate:r}),{appointmentAppearanceByResource:te,appointmentBgByResource:re,laidOutByResource:tt}=ke({appointmentColorTokenClassMap:R,dayStartAbs:O,drag:u,getResourceAppointmentAppearance:m,getResourceAppointmentBackground:l,getResourceAppointmentColorToken:p,renderAppts:F,resourceAppointmentClassMap:d,resources:e,selectedDate:r}),x=h.useMemo(()=>u.kind!=="move"||!g?null:{appointment:{...g.appointment,resourceId:u.resourceId,startMin:u.startMin,endMin:u.endMin,visualState:"ghost",renderKey:`${g.appointment.renderKey}-overlay`,lane:0,lanes:1},appearance:te.get(u.resourceId),background:re.get(u.resourceId),left:g.clientX-g.offsetX,top:g.clientY-g.offsetY,width:g.width,height:g.height},[te,re,u,g]);return jsxs("section",{className:`rfs-root rfs:rounded-lg rfs:bg-background rfs:text-foreground ${u.kind==="move"?"rfs-root--drag-move":""} ${u.kind==="resize"?"rfs-root--drag-resize":""}`,onPointerMove:Y,onPointerUp:k,onPointerCancel:k,children:[jsx(Ze,{selectedDate:r,onSelectedDateChange:s,prevButtonLabel:I,nextButtonLabel:T,renderToolbar:b,renderDatePicker:A}),jsx("div",{className:"rfs-shell rfs:border-border rfs:bg-card",children:jsxs("div",{style:{minWidth:j},children:[jsx(Ee,{resources:e,renderResourceHeader:a}),jsxs("div",{className:"rfs-body",children:[jsx(we,{dayMinutes:z,dayStartAbs:O,gridHeight:$}),jsx("div",{className:"rfs-grid",children:e.map(L=>jsx(_e,{resource:L,colRefs:ee,gridHeight:$,dayMinutes:z,appointments:tt.get(L.id)??[],appointmentAppearance:te.get(L.id),appointmentBg:re.get(L.id),isDropInvalid:f,renderAppointment:n,onApptPointerDown:y,onResizePointerDown:et,drag:u.kind==="resize"&&u.resourceId===L.id?u:Dt,suppressClickRef:le},String(L.id)))})]})]})}),x?jsx("div",{className:"rfs-drag-overlay",style:{left:x.left,top:x.top,width:x.width,height:x.height},children:(n??G)({appointment:x.appointment,isDropInvalid:f,onPointerDown:()=>{},onResizePointerDown:()=>{},appointmentAppearance:x.appearance,appointmentBackgroundColor:x.background,drag:u,suppressClickRef:le})}):null]})}function wt(e,t,r){return e.map(s=>{if(r.getId(s)!==r.getId(t.appointment))return s;let o=r.setResourceId(s,t.next.resourceId),i=r.setStart(o,t.next.start);return r.setEnd(i,t.next.end)})}export{kt as Scheduler,wt as applySchedulerAppointmentChange};
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {format,startOfMonth,startOfWeek,endOfWeek,endOfMonth,addDays,addMonths,isSameDay,isToday,isSameMonth}from'date-fns';import*as g from'react';var ct=e=>{let{isDropInvalid:t,description:r,title:o}=e;return jsxs(Fragment,{children:[t&&jsx("div",{className:"rfs:absolute rfs:right-1 rfs:top-1 rfs:flex rfs:h-4 rfs:w-4 rfs:items-center rfs:justify-center rfs:rounded-full rfs:bg-red-600 rfs:text-[10px] rfs:font-bold rfs:text-white",children:"X"}),jsx("div",{className:"rfs:text-xs rfs:font-semibold",children:o}),r&&jsx("div",{className:"rfs:mt-1 rfs:text-[10px] rfs:font-medium",children:r})]})},ge=ct;function ie({appointment:e,onResizePointerDown:t}){return jsx("div",{role:"button","aria-label":"Resize appointment",onPointerDown:r=>{e.visualState!=="ghost"&&(r.stopPropagation(),t(r));},className:"rfs:absolute rfs:inset-x-1 rfs:bottom-1 rfs:h-2 rfs:cursor-ns-resize rfs:rounded-full rfs:bg-border/90 rfs:transition-colors rfs:hover:bg-border"})}function q({appointment:e,isDropInvalid:t,onPointerDown:r,onResizePointerDown:o,appointmentAppearance:n,appointmentBackgroundColor:i}){let u=e.raw,d=typeof u.description=="string"?u.description:void 0,s=typeof i=="string"?i:void 0,c=n?.className??s??"rfs:bg-muted/40 rfs:dark:bg-muted/30",m=t?"rfs:bg-red-100/80 rfs:text-red-950 rfs:dark:bg-red-950/40 rfs:dark:text-red-100":"",f=e.visualState==="ghost"?"rfs:cursor-grab rfs:opacity-35":e.visualState==="dragging"?"rfs:cursor-grabbing rfs:opacity-55 rfs:shadow-xl":"rfs:cursor-grab",R=`rfs:relative rfs:h-full rfs:overflow-hidden rfs:rounded-md rfs:p-2 rfs:pb-5 rfs:text-foreground ${c} ${m} ${f}`;return jsxs("div",{onPointerDown:r,className:R,children:[jsx(ge,{isDropInvalid:t,title:e.title,description:d}),jsx(ie,{onResizePointerDown:o,appointment:e})]})}var F=(e,t)=>typeof t=="function"?t(e):e[t],de=e=>"getId"in e?e:{getEnd:t=>F(t,e.end),getId:t=>F(t,e.id),getResourceId:t=>F(t,e.resourceId),getStart:t=>F(t,e.start),getTitle:t=>F(t,e.title)};function Se(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var be={slate:"bg-slate-100 dark:bg-slate-900/40",gray:"bg-gray-100 dark:bg-gray-900/40",zinc:"bg-zinc-100 dark:bg-zinc-900/40",neutral:"bg-neutral-100 dark:bg-neutral-900/40",stone:"bg-stone-100 dark:bg-stone-900/40",red:"bg-red-100 dark:bg-red-950/40",orange:"bg-orange-100 dark:bg-orange-950/40",amber:"bg-amber-100 dark:bg-amber-950/40",yellow:"bg-yellow-100 dark:bg-yellow-950/40",lime:"bg-lime-100 dark:bg-lime-950/40",green:"bg-green-100 dark:bg-green-950/40",emerald:"bg-emerald-100 dark:bg-emerald-950/40",teal:"bg-teal-100 dark:bg-teal-950/40",cyan:"bg-cyan-100 dark:bg-cyan-950/40",sky:"bg-sky-100 dark:bg-sky-950/40",blue:"bg-blue-100 dark:bg-blue-950/40",indigo:"bg-indigo-100 dark:bg-indigo-950/40",violet:"bg-violet-100 dark:bg-violet-950/40",purple:"bg-purple-100 dark:bg-purple-950/40",fuchsia:"bg-fuchsia-100 dark:bg-fuchsia-950/40",pink:"bg-pink-100 dark:bg-pink-950/40",rose:"bg-rose-100 dark:bg-rose-950/40"};function w(e,t,r){return Math.max(t,Math.min(r,e))}function V(e,t=15){return Math.round(e/t)*t}function ue(e){let[t,r]=e.split(":").map(Number);return t*60+r}function Ae(e){return `${e.firstName??""} ${e.lastName??""}`.trim()}function J(e){return format(e,"yyyy-MM-dd")}function ce(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function z(e,t,r){let o=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),n=t+r,i=Math.floor(n/60),u=n%60;return o.setHours(i,u,0,0),o}function ae(e,t){return t.getHours()*60+t.getMinutes()-e}function pe(e,t){return e.startMin<t.endMin&&t.startMin<e.endMin}function ye(e){let t=[...e].sort((u,d)=>u.startMin-d.startMin||u.endMin-d.endMin),r=[],o=[],n=[];for(let u of t)o=o.filter(s=>s.endMin>u.startMin),!o.some(s=>pe(s,u))&&n.length>0&&(r.push(n),n=[]),n.push(u),o.push(u);n.length&&r.push(n);let i=[];for(let u of r){let d=[...u].sort((f,R)=>f.startMin-R.startMin||f.endMin-R.endMin),s=[],c=new Map;for(let f of d){let R=false;for(let l=0;l<s.length;l++)if(s[l]<=f.startMin){s[l]=f.endMin,c.set(f.id,l),R=true;break}R||(s.push(f.endMin),c.set(f.id,s.length-1));}let m=s.length;for(let f of d)i.push({...f,lane:c.get(f.id)??0,lanes:m});}return i}function le({fallback:e,getValue:t,resources:r,toKey:o}){let n=new Map;for(let i of r)n.set(o(i),t(i)??e);return n}function Me({adapter:e,appointments:t,dayMinutes:r,dayStartAbs:o,selectedISO:n}){return t.map(i=>{let u=e.getId(i),d=new Date(e.getStart(i)),s=new Date(e.getEnd(i));return {raw:i,id:u,resourceId:e.getResourceId(i),start:d,end:s,startMin:w(ae(o,d),0,r),endMin:w(ae(o,s),0,r),title:e.getTitle(i),renderKey:String(u),visualState:"normal"}}).filter(i=>J(i.start)===n)}function ve(e){return new Map(e.map(t=>[t.id,t]))}function Pe(e,t,r,o){return t.kind==="none"||t.kind==="move"?e:e.map(n=>n.id!==t.appointmentId?n:{...n,resourceId:t.resourceId,startMin:t.startMin,endMin:t.endMin,start:z(r,o,t.startMin),end:z(r,o,t.endMin),visualState:"dragging"})}function xe(e,t){let r=new Map;for(let n of t){let i=r.get(n.resourceId)??[];i.push(n),r.set(n.resourceId,i);}let o=new Map;for(let n of e)o.set(n.id,fe(r.get(n.id)??[]));return o}function fe(e){return ye(e.map(t=>({...t,appointmentId:t.id,id:t.renderKey}))).map(({appointmentId:t,...r})=>({...r,id:t}))}function De(e,t,r,o,n){let i=new Map;for(let u of e){let d=t?.[String(u.id)];if(d){i.set(u.id,{className:d});continue}let s=r?.(u);if(s){i.set(u.id,s);continue}let c=o.get(u.id);if(c){i.set(u.id,{className:c});continue}let m=n.get(u.id);i.set(u.id,m?{className:m}:void 0);}return i}function Ne({adapter:e,appointments:t,dayEnd:r="18:00",dayStart:o="09:00",resources:n,selectedDate:i}){let u=g.useMemo(()=>ue(o),[o]),d=g.useMemo(()=>ue(r),[r]),s=g.useMemo(()=>Math.max(0,d-u),[d,u]),c=g.useMemo(()=>12+s*2+24,[s]),m=g.useMemo(()=>72+Math.max(n.length,1)*420,[n.length]),f=g.useMemo(()=>de(e),[e]),R=g.useMemo(()=>J(i),[i]),l=g.useMemo(()=>Me({adapter:f,appointments:t,dayMinutes:s,dayStartAbs:u,selectedISO:R}),[t,s,u,f,R]);return {appointmentMap:g.useMemo(()=>ve(l),[l]),dayEndAbs:d,dayMinutes:s,dayStartAbs:u,gridHeight:c,gridMinWidth:m,renderAppts:l}}var Rt=4,ht=(e,t)=>{e(r=>r&&{...r,clientX:t.clientX,clientY:t.clientY});},gt=e=>{let{dragRef:t,pendingDragRef:r,pointer:o,setDrag:n,setMovePreview:i,suppressClickRef:u}=e,d=r.current;if(!d||d.drag.pointerId!==o.pointerId)return;let s=o.clientX-d.startClientX,c=o.clientY-d.startClientY;Math.hypot(s,c)<Rt||(u.current=true,t.current=d.drag,n(d.drag),d.drag.kind==="move"&&i({appointment:d.appointment,clientX:o.clientX,clientY:o.clientY,width:d.width,height:d.height,offsetX:d.offsetX,offsetY:d.offsetY}),r.current=null);},Tt=(e,t,r,o,n)=>{let i=o(t.clientX,e.resourceId),d=n(i,t.clientY)-e.offsetMin,s=w(V(d),0,r-e.durationMin),c=s+e.durationMin;return s===e.startMin&&c===e.endMin&&i===e.resourceId?null:{...e,resourceId:i,startMin:s,endMin:c}},It=(e,t,r,o)=>{let n=o(e.resourceId,t.clientY),i=w(V(n),e.startMin+15,r);return i===e.endMin?null:{...e,endMin:i}},Be=e=>{let{dayMinutes:t,dragRef:r,latestPointerRef:o,pendingDragRef:n,pointerToMin:i,pointerToResourceId:u,setDrag:d,setMovePreview:s,suppressClickRef:c}=e,m=o.current;if(!m)return;let f=r.current;if(f.kind==="none"&&n.current){gt({pointer:m,pendingDragRef:n,setDrag:d,setMovePreview:s,dragRef:r,suppressClickRef:c});return}if(f.kind==="none")return;if(f.kind==="move"){ht(s,m);let l=Tt(f,m,t,u,i);l&&(c.current=true,r.current=l,d(l));return}let R=It(f,m,t,i);R&&(c.current=true,r.current=R,d(R));},Ee=e=>{let{dragRef:t,frameRef:r,latestPointerRef:o,pendingDragRef:n,persistDrag:i,setDrag:u,setMovePreview:d,suppressClickRef:s}=e;r.current!==null&&(window.cancelAnimationFrame(r.current),r.current=null),o.current=null,n.current=null,d(null);let c=t.current;c.kind!=="none"&&(u({kind:"none"}),t.current={kind:"none"},s.current&&i(c));};var Oe=({appointmentMap:e,dayMinutes:t,dayStartAbs:r,onAppointmentChange:o,onPersistMoveResize:n,renderAppts:i,resources:u,selectedDate:d,editable:s})=>{let[c,m]=g.useState({kind:"none"}),[f,R]=g.useState(null),l=g.useRef({}),T=g.useRef(false),x=g.useRef({kind:"none"}),b=g.useRef(null),A=g.useRef(null),y=g.useRef(null),$=g.useMemo(()=>{let p=new Map;for(let a of i){let h=p.get(a.resourceId)??[];h.push(a),p.set(a.resourceId,h);}return p},[i]);g.useEffect(()=>{x.current=c;},[c]),g.useEffect(()=>()=>{y.current!==null&&window.cancelAnimationFrame(y.current);},[]);let O=g.useCallback((p,a)=>{let h=l.current[String(p)];if(!h)return 0;let M=a-h.getBoundingClientRect().top-12;return w(V(M/2),0,t)},[t]),W=g.useCallback((p,a)=>{for(let h of u){let M=l.current[String(h.id)];if(!M)continue;let L=M.getBoundingClientRect();if(p>=L.left&&p<=L.right)return h.id}return a},[u]),D=g.useCallback((p,a,h,M)=>($.get(a)??[]).some(K=>K.id!==p&&pe(K,{startMin:h,endMin:M})),[$]),Y=g.useMemo(()=>c.kind==="none"?false:D(c.appointmentId,c.resourceId,c.startMin,c.endMin),[c,D]),X=g.useCallback(async p=>{let a=e.get(p.appointmentId);if(!a||D(p.appointmentId,p.resourceId,p.startMin,p.endMin))return;let h={resourceId:p.resourceId,start:z(d,r,p.startMin),end:z(d,r,p.endMin)};if(o){await o({kind:p.kind,appointment:a.raw,resourceId:h.resourceId,start:h.start,end:h.end,previousResourceId:a.resourceId,previousStart:a.start,previousEnd:a.end,previous:{resourceId:a.resourceId,start:a.start,end:a.end},next:h});return}n&&await n({appointment:a.raw,resourceId:h.resourceId,start:h.start,end:h.end});},[e,r,D,o,n,d]),te=g.useCallback((p,a)=>{if(!s||p.button!==0)return;p.stopPropagation(),T.current=false;let h=p.currentTarget.getBoundingClientRect(),M=O(a.resourceId,p.clientY);b.current={drag:{kind:"move",appointmentId:a.id,pointerId:p.pointerId,resourceId:a.resourceId,durationMin:Math.max(15,a.endMin-a.startMin),offsetMin:M-a.startMin,startMin:a.startMin,endMin:a.endMin},appointment:a,startClientX:p.clientX,startClientY:p.clientY,width:h.width,height:h.height,offsetX:p.clientX-h.left,offsetY:p.clientY-h.top};},[O,s]),G=g.useCallback((p,a)=>{s&&p.button===0&&(p.stopPropagation(),T.current=false,b.current={drag:{kind:"resize",appointmentId:a.id,pointerId:p.pointerId,resourceId:a.resourceId,startMin:a.startMin,endMin:a.endMin},appointment:a,startClientX:p.clientX,startClientY:p.clientY,width:0,height:0,offsetX:0,offsetY:0});},[s]),re=g.useCallback(p=>{A.current={clientX:p.clientX,clientY:p.clientY,pointerId:p.pointerId},y.current===null&&(y.current=window.requestAnimationFrame(()=>{y.current=null,Be({dayMinutes:t,dragRef:x,latestPointerRef:A,pendingDragRef:b,pointerToMin:O,pointerToResourceId:W,setDrag:m,setMovePreview:R,suppressClickRef:T});}));},[t,O,W]),S=g.useCallback(()=>{Ee({dragRef:x,frameRef:y,latestPointerRef:A,pendingDragRef:b,persistDrag:X,setDrag:m,setMovePreview:R,suppressClickRef:T});},[X]);return {colRefs:l,drag:c,isDropInvalid:Y,movePreview:f,onApptPointerDown:te,onGlobalPointerMove:re,onGlobalPointerUp:S,onResizePointerDown:G,suppressClickRef:T}};function Le({appointmentColorTokenClassMap:e,dayStartAbs:t,drag:r,getResourceAppointmentAppearance:o,getResourceAppointmentBackground:n,getResourceAppointmentColorToken:i,renderAppts:u,resourceAppointmentClassMap:d,resources:s,selectedDate:c}){let m=g.useMemo(()=>Pe(u,r,c,t),[t,r,u,c]),f=g.useMemo(()=>xe(s,u),[u,s]),R=g.useMemo(()=>{if(r.kind!=="resize")return f;let b=new Map(f),A=m.filter(y=>y.resourceId===r.resourceId);return b.set(r.resourceId,fe(A)),b},[f,r,m]),l=g.useMemo(()=>n?le({fallback:void 0,getValue:n,resources:s,toKey:b=>b.id}):new Map,[n,s]),T=g.useMemo(()=>{if(!i)return new Map;let b={...be,...e??{}};return le({fallback:void 0,getValue:A=>{let y=i(A);return y?b[y]:void 0},resources:s,toKey:A=>A.id})},[e,i,s]);return {appointmentAppearanceByResource:g.useMemo(()=>De(s,d,o,T,l),[l,T,o,d,s]),appointmentBgByResource:l,effectiveAppts:m,laidOutByResource:R}}function _e({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsx("div",{className:"rfs-times rfs:border-border rfs:bg-card",style:{width:72,height:r},children:Array.from({length:Math.floor(e/60)+1}).map((o,n)=>jsxs("div",{className:"rfs-time-tick rfs:text-muted-foreground",style:{top:12+n*60*2},children:[String(Math.floor((t+n*60)/60)).padStart(2,"0"),":",String((t+n*60)%60).padStart(2,"0")]},`tick-${n}`))})}function ze({resource:e}){return jsx("strong",{children:e.label})}function Xe({resources:e,renderResourceHeader:t}){return jsxs("div",{className:"rfs-header rfs:border-border rfs:bg-card",children:[jsx("div",{className:"rfs-gutter rfs:border-border",style:{width:72}}),e.map(r=>jsxs("div",{className:"rfs-resource-header rfs:border-border rfs:bg-card rfs:text-foreground",style:{minWidth:420,flex:1},children:[(t??(o=>ze({resource:o})))(r),Se(r)?jsx("div",{className:"rfs-resource-subtitle rfs:text-muted-foreground",children:Ae(r)}):null]},String(r.id)))]})}var Fe=({resource:e,colRefs:t,gridHeight:r,dayMinutes:o,appointments:n,appointmentAppearance:i,appointmentBg:u,isDropInvalid:d,renderAppointment:s,onApptPointerDown:c,onResizePointerDown:m,drag:f,suppressClickRef:R})=>jsx("div",{className:"rfs-col rfs:border-border rfs:bg-card",style:{minWidth:420,flex:1},children:jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner rfs:bg-card",style:{height:r},children:[Array.from({length:Math.floor(o/60)+1}).map((l,T)=>jsx("div",{className:"rfs-hour-line rfs:border-border/70",style:{top:12+T*60*2}},`major-${T}`)),Array.from({length:Math.floor(o/15)+1}).map((l,T)=>jsx("div",{className:"rfs-slot-line rfs:border-border/50",style:{top:12+T*15*2}},`minor-${T}`)),n.map(l=>{let T=100/l.lanes,x=12+l.startMin*2,b=Math.max(30,(l.endMin-l.startMin)*2);return jsx("div",{className:`rfs-card-slot ${l.visualState==="ghost"?"rfs-card-slot--ghost":""} ${l.visualState==="dragging"?"rfs-card-slot--dragging":""}`,style:{top:x,left:`${T*l.lane}%`,width:`${T}%`,height:b},children:(s??q)({appointment:l,isDropInvalid:d&&f.kind==="resize"&&l.id===f.appointmentId,onPointerDown:A=>c(A,l),onResizePointerDown:A=>m(A,l),appointmentAppearance:i,appointmentBackgroundColor:u,drag:f,suppressClickRef:R})},l.renderKey)})]})});var Mt=(e,t)=>[e.resource===t.resource,e.colRefs===t.colRefs,e.gridHeight===t.gridHeight,e.dayMinutes===t.dayMinutes,e.appointments===t.appointments,e.appointmentAppearance===t.appointmentAppearance,e.appointmentBg===t.appointmentBg,e.isDropInvalid===t.isDropInvalid,e.renderAppointment===t.renderAppointment,e.onApptPointerDown===t.onApptPointerDown,e.onResizePointerDown===t.onResizePointerDown,e.drag===t.drag,e.suppressClickRef===t.suppressClickRef].every(Boolean),Ue=g.memo(Fe,Mt);function H(...e){return e.filter(Boolean).join(" ")}var vt={default:"rfs:bg-primary rfs:text-primary-foreground rfs:hover:bg-primary/90",outline:"rfs:border rfs:border-border rfs:bg-card rfs:text-foreground rfs:hover:bg-muted",ghost:"rfs:text-foreground rfs:hover:bg-muted"},Pt={default:"rfs:h-9 rfs:px-4 rfs:py-2",sm:"rfs:h-8 rfs:px-3 rfs:text-xs",icon:"rfs:h-8 rfs:w-8"},P=g.forwardRef(function({className:t,variant:r="default",size:o="default",type:n="button",...i},u){return jsx("button",{ref:u,type:n,className:H("rfs:inline-flex rfs:items-center rfs:justify-center rfs:gap-2 rfs:rounded-md rfs:text-sm rfs:font-medium rfs:whitespace-nowrap rfs:transition-colors rfs:focus-visible:outline-none rfs:focus-visible:ring-2 rfs:focus-visible:ring-ring rfs:focus-visible:ring-offset-2 rfs:disabled:pointer-events-none rfs:disabled:opacity-50",vt[r],Pt[o],t),...i})});function qe({selected:e,onSelect:t}){let[r,o]=g.useState(e??new Date);g.useEffect(()=>{e&&o(e);},[e]);let n=startOfMonth(r),i=startOfWeek(n,{weekStartsOn:1}),u=endOfWeek(endOfMonth(r),{weekStartsOn:1}),d=[];for(let s=i;s<=u;s=addDays(s,1))d.push(s);return jsxs("div",{className:"rfs:w-72 rfs:rounded-md rfs:bg-popover",children:[jsxs("div",{className:"rfs:mb-2 rfs:flex rfs:items-center rfs:justify-between",children:[jsx(P,{variant:"ghost",size:"icon","aria-label":"Previous month",onClick:()=>o(addMonths(r,-1)),children:"<"}),jsx("div",{className:"rfs:text-sm rfs:font-medium",children:format(r,"MMMM yyyy")}),jsx(P,{variant:"ghost",size:"icon","aria-label":"Next month",onClick:()=>o(addMonths(r,1)),children:">"})]}),jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1 rfs:text-center rfs:text-xs rfs:text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(s=>jsx("div",{className:"rfs:py-1",children:s},s))}),jsx("div",{className:"rfs:grid rfs:grid-cols-7 rfs:gap-1",children:d.map(s=>{let c=e?isSameDay(s,e):false;return jsx(P,{variant:c?"default":"ghost",size:"icon",className:H("rfs:text-xs",!isSameMonth(s,r)&&"rfs:text-muted-foreground rfs:opacity-60",isToday(s)&&!c&&"rfs:border rfs:border-border"),onClick:()=>t?.(s),children:format(s,"d")},s.toISOString())})})]})}var Je=g.createContext(null);function Qe(){let e=g.useContext(Je);if(!e)throw new Error("Popover components must be used within Popover.");return e}function Ze({children:e,open:t,onOpenChange:r}){let[o,n]=g.useState(false),i=g.useRef(null),u=g.useRef(null),d=t??o,s=g.useCallback(c=>{let m=typeof c=="function"?c(d):c;t===void 0&&n(m),r?.(m);},[t,r,d]);return g.useEffect(()=>{if(!d)return;let c=f=>{let R=f.target;i.current?.contains(R)||u.current?.contains(R)||s(false);},m=f=>{f.key==="Escape"&&s(false);};return document.addEventListener("mousedown",c),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",c),document.removeEventListener("keydown",m);}},[d,s]),jsx(Je.Provider,{value:{open:d,setOpen:s,triggerRef:i,contentRef:u},children:jsx("div",{className:"rfs:relative rfs:inline-flex",children:e})})}function je({children:e,asChild:t=false}){let{open:r,setOpen:o,triggerRef:n}=Qe();if(t&&g.isValidElement(e)){let i=e;return g.cloneElement(i,{ref:n,"aria-expanded":r,onClick:u=>{i.props.onClick?.(u),o(d=>!d);}})}return jsx("button",{ref:n,type:"button","aria-expanded":r,onClick:()=>o(i=>!i),children:e})}function et({children:e,className:t,align:r="start"}){let{open:o,contentRef:n}=Qe();return o?jsx("div",{ref:n,className:H("rfs:absolute rfs:top-full rfs:z-50 rfs:mt-2 rfs:min-w-72 rfs:rounded-md rfs:border rfs:border-border rfs:bg-popover rfs:p-2 rfs:text-popover-foreground rfs:shadow-md rfs:outline-none",r==="start"&&"rfs:left-0",r==="center"&&"rfs:left-1/2 rfs:-translate-x-1/2",r==="end"&&"rfs:right-0",t),children:e}):null}function tt({selectedDate:e,onSelectedDateChange:t}){return jsxs(Ze,{children:[jsx(je,{asChild:true,children:jsx(P,{variant:"outline",size:"sm",className:"rfs:min-w-40 rfs:justify-start rfs:text-left rfs:font-normal",children:format(e,"PPP")})}),jsx(et,{className:"rfs:w-auto rfs:p-2",align:"center",children:jsx(qe,{selected:e,onSelect:t})})]})}function rt({goToPreviousDay:e,goToNextDay:t,defaultDatePicker:r,prevButtonLabel:o="Prev",nextButtonLabel:n="Next"}){return jsx("div",{className:"rfs-toolbar",children:jsxs("div",{className:"rfs:flex rfs:items-center rfs:gap-2 rfs:rounded-lg rfs:border rfs:border-border rfs:bg-card rfs:p-1 rfs:shadow-xs",children:[jsx(P,{variant:"outline",size:"sm",onClick:e,children:o}),r,jsx(P,{variant:"outline",size:"sm",onClick:t,children:n})]})})}function st({selectedDate:e,onSelectedDateChange:t,prevButtonLabel:r,nextButtonLabel:o,renderToolbar:n,renderDatePicker:i}){let u=()=>t(ce(e,-1)),d=()=>t(ce(e,1)),s=(i??tt)({selectedDate:e,onSelectedDateChange:t});return n?jsx(Fragment,{children:n({selectedDate:e,onSelectedDateChange:t,goToPreviousDay:u,goToNextDay:d,defaultDatePicker:s})}):jsx(Fragment,{children:rt({goToPreviousDay:u,goToNextDay:d,defaultDatePicker:s,prevButtonLabel:r,nextButtonLabel:o})})}var Ht={kind:"none"};function Yt({resources:e,appointments:t,selectedDate:r,onSelectedDateChange:o,adapter:n,onPersistMoveResize:i,onAppointmentChange:u,renderResourceHeader:d,renderAppointment:s,resourceAppointmentClassMap:c,getResourceAppointmentAppearance:m,getResourceAppointmentColorToken:f,appointmentColorTokenClassMap:R,getResourceAppointmentBackground:l,renderToolbar:T,renderDatePicker:x,prevButtonLabel:b="Prev",nextButtonLabel:A="Next",dayStart:y="09:00",dayEnd:$="18:00",editable:O=true}){let{appointmentMap:W,dayMinutes:D,dayStartAbs:Y,gridHeight:X,gridMinWidth:te,renderAppts:G}=Ne({adapter:n,appointments:t,dayEnd:$,dayStart:y,resources:e,selectedDate:r}),{colRefs:re,drag:S,isDropInvalid:p,movePreview:a,onApptPointerDown:h,onGlobalPointerMove:M,onGlobalPointerUp:L,onResizePointerDown:K,suppressClickRef:he}=Oe({appointmentMap:W,dayMinutes:D,dayStartAbs:Y,onAppointmentChange:u,onPersistMoveResize:i,renderAppts:G,resources:e,selectedDate:r,editable:O}),{appointmentAppearanceByResource:ne,appointmentBgByResource:oe,laidOutByResource:ut}=Le({appointmentColorTokenClassMap:R,dayStartAbs:Y,drag:S,getResourceAppointmentAppearance:m,getResourceAppointmentBackground:l,getResourceAppointmentColorToken:f,renderAppts:G,resourceAppointmentClassMap:c,resources:e,selectedDate:r}),k=g.useMemo(()=>S.kind!=="move"||!a?null:{appointment:{...a.appointment,resourceId:S.resourceId,startMin:S.startMin,endMin:S.endMin,visualState:"ghost",renderKey:`${a.appointment.renderKey}-overlay`,lane:0,lanes:1},appearance:ne.get(S.resourceId),background:oe.get(S.resourceId),left:a.clientX-a.offsetX,top:a.clientY-a.offsetY,width:a.width,height:a.height},[ne,oe,S,a]);return jsxs("section",{className:`rfs-root rfs:rounded-lg rfs:text-foreground ${S.kind==="move"?"rfs-root--drag-move":""} ${S.kind==="resize"?"rfs-root--drag-resize":""}`,onPointerMove:M,onPointerUp:L,onPointerCancel:L,children:[jsx(st,{selectedDate:r,onSelectedDateChange:o,prevButtonLabel:b,nextButtonLabel:A,renderToolbar:T,renderDatePicker:x}),jsx("div",{className:"rfs-shell rfs:border-border rfs:bg-card",children:jsxs("div",{style:{minWidth:te},children:[jsx(Xe,{resources:e,renderResourceHeader:d}),jsxs("div",{className:"rfs-body",children:[jsx(_e,{dayMinutes:D,dayStartAbs:Y,gridHeight:X}),jsx("div",{className:"rfs-grid",children:e.map(_=>jsx(Ue,{resource:_,colRefs:re,gridHeight:X,dayMinutes:D,appointments:ut.get(_.id)??[],appointmentAppearance:ne.get(_.id),appointmentBg:oe.get(_.id),isDropInvalid:p,renderAppointment:s,onApptPointerDown:h,onResizePointerDown:K,drag:S.kind==="resize"&&S.resourceId===_.id?S:Ht,suppressClickRef:he},String(_.id)))})]})]})}),k?jsx("div",{className:"rfs-drag-overlay",style:{left:k.left,top:k.top,width:k.width,height:k.height},children:(s??q)({appointment:k.appointment,isDropInvalid:p,onPointerDown:()=>{},onResizePointerDown:()=>{},appointmentAppearance:k.appearance,appointmentBackgroundColor:k.background,drag:S,suppressClickRef:he})}):null]})}var dt=(e,t)=>typeof t=="function"?t(e):e[t],Xt=e=>"id"in e,Ft=e=>({resourceId:e.resourceId??e.next.resourceId,start:e.start??e.next.start,end:e.end??e.next.end}),Vt=(e,t,r)=>{let o=Ft(t);return e.map(n=>{if(Xt(r)){if(dt(n,r.id)!==dt(t.appointment,r.id))return n;let d=r.dateValue??(s=>s);return {...n,[r.resourceId]:o.resourceId,[r.start]:d(o.start),[r.end]:d(o.end)}}if(r.getId(n)!==r.getId(t.appointment))return n;let i=r.setResourceId(n,o.resourceId),u=r.setStart(i,o.start);return r.setEnd(u,o.end)})};export{Yt as Scheduler,Vt as applySchedulerAppointmentChange,de as resolveSchedulerAppointmentAdapter};
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.rfs-root, .rfs-root *,.rfs-root :before,.rfs-root :after,.rfs-root::backdrop, .rfs-root ::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{.rfs-root,.rfs-root{--rfs-color-red-100:oklch(93.6% .032 17.717);--rfs-color-red-600:oklch(57.7% .245 27.325);--rfs-color-red-950:oklch(25.8% .092 26.042);--rfs-color-white:#fff;--rfs-spacing:.25rem;--rfs-text-xs:.75rem;--rfs-text-xs--line-height:calc(1 / .75);--rfs-text-sm:.875rem;--rfs-text-sm--line-height:calc(1.25 / .875);--rfs-font-weight-normal:400;--rfs-font-weight-medium:500;--rfs-font-weight-semibold:600;--rfs-font-weight-bold:700;--rfs-default-transition-duration:.15s;--rfs-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--rfs-default-font-family:var(--font-sans);--rfs-default-mono-font-family:var(--font-mono)}}@layer base{.rfs-root, .rfs-root *,.rfs-root :after,.rfs-root :before,.rfs-root::backdrop, .rfs-root ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.rfs-root,.rfs-root{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--rfs-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--rfs-default-font-feature-settings,normal);font-variation-settings:var(--rfs-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}.rfs-root hr{height:0;color:inherit;border-top-width:1px}.rfs-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.rfs-root h1,.rfs-root h2,.rfs-root h3,.rfs-root h4,.rfs-root h5,.rfs-root h6{font-size:inherit;font-weight:inherit}.rfs-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.rfs-root b,.rfs-root strong{font-weight:bolder}.rfs-root code,.rfs-root kbd,.rfs-root samp,.rfs-root pre{font-family:var(--rfs-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--rfs-default-mono-font-feature-settings,normal);font-variation-settings:var(--rfs-default-mono-font-variation-settings,normal);font-size:1em}.rfs-root small{font-size:80%}.rfs-root sub,.rfs-root sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}.rfs-root sub{bottom:-.25em}.rfs-root sup{top:-.5em}.rfs-root table{text-indent:0;border-color:inherit;border-collapse:collapse}.rfs-root :-moz-focusring{outline:auto}.rfs-root progress{vertical-align:baseline}.rfs-root summary{display:list-item}.rfs-root ol,.rfs-root ul,.rfs-root menu{list-style:none}.rfs-root img,.rfs-root svg,.rfs-root video,.rfs-root canvas,.rfs-root audio,.rfs-root iframe,.rfs-root embed,.rfs-root object{vertical-align:middle;display:block}.rfs-root img,.rfs-root video{max-width:100%;height:auto}.rfs-root button,.rfs-root input,.rfs-root select,.rfs-root optgroup,.rfs-root textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}.rfs-root :where(select:is([multiple],[size])) optgroup{font-weight:bolder}.rfs-root :where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{margin-inline-end:4px}.rfs-root::placeholder, .rfs-root ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){.rfs-root::placeholder, .rfs-root ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){.rfs-root::placeholder, .rfs-root ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}.rfs-root textarea{resize:vertical}.rfs-root::-webkit-search-decoration, .rfs-root ::-webkit-search-decoration{-webkit-appearance:none}.rfs-root::-webkit-date-and-time-value, .rfs-root ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}.rfs-root::-webkit-datetime-edit, .rfs-root ::-webkit-datetime-edit{display:inline-flex}.rfs-root::-webkit-datetime-edit-fields-wrapper, .rfs-root ::-webkit-datetime-edit-fields-wrapper{padding:0}.rfs-root::-webkit-datetime-edit, .rfs-root ::-webkit-datetime-edit{padding-block:0}.rfs-root::-webkit-datetime-edit-year-field, .rfs-root ::-webkit-datetime-edit-year-field{padding-block:0}.rfs-root::-webkit-datetime-edit-month-field, .rfs-root ::-webkit-datetime-edit-month-field{padding-block:0}.rfs-root::-webkit-datetime-edit-day-field, .rfs-root ::-webkit-datetime-edit-day-field{padding-block:0}.rfs-root::-webkit-datetime-edit-hour-field, .rfs-root ::-webkit-datetime-edit-hour-field{padding-block:0}.rfs-root::-webkit-datetime-edit-minute-field, .rfs-root ::-webkit-datetime-edit-minute-field{padding-block:0}.rfs-root::-webkit-datetime-edit-second-field, .rfs-root ::-webkit-datetime-edit-second-field{padding-block:0}.rfs-root::-webkit-datetime-edit-millisecond-field, .rfs-root ::-webkit-datetime-edit-millisecond-field{padding-block:0}.rfs-root::-webkit-datetime-edit-meridiem-field, .rfs-root ::-webkit-datetime-edit-meridiem-field{padding-block:0}.rfs-root::-webkit-calendar-picker-indicator, .rfs-root ::-webkit-calendar-picker-indicator{line-height:1}.rfs-root :-moz-ui-invalid{box-shadow:none}.rfs-root button,.rfs-root input:where([type=button],[type=reset],[type=submit]){appearance:button}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{appearance:button}.rfs-root::-webkit-inner-spin-button, .rfs-root ::-webkit-inner-spin-button{height:auto}.rfs-root::-webkit-outer-spin-button, .rfs-root ::-webkit-outer-spin-button{height:auto}.rfs-root [hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.rfs-root.rfs\:absolute, .rfs-root .rfs\:absolute{position:absolute}.rfs-root.rfs\:relative, .rfs-root .rfs\:relative{position:relative}.rfs-root.rfs\:inset-x-1, .rfs-root .rfs\:inset-x-1{inset-inline:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:top-1, .rfs-root .rfs\:top-1{top:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:top-full, .rfs-root .rfs\:top-full{top:100%}.rfs-root.rfs\:right-0, .rfs-root .rfs\:right-0{right:calc(var(--rfs-spacing) * 0)}.rfs-root.rfs\:right-1, .rfs-root .rfs\:right-1{right:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:bottom-1, .rfs-root .rfs\:bottom-1{bottom:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:left-0, .rfs-root .rfs\:left-0{left:calc(var(--rfs-spacing) * 0)}.rfs-root.rfs\:left-1\/2, .rfs-root .rfs\:left-1\/2{left:50%}.rfs-root.rfs\:z-50, .rfs-root .rfs\:z-50{z-index:50}.rfs-root.rfs\:mt-1, .rfs-root .rfs\:mt-1{margin-top:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:mt-2, .rfs-root .rfs\:mt-2{margin-top:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:mb-2, .rfs-root .rfs\:mb-2{margin-bottom:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:flex, .rfs-root .rfs\:flex{display:flex}.rfs-root.rfs\:grid, .rfs-root .rfs\:grid{display:grid}.rfs-root.rfs\:inline-flex, .rfs-root .rfs\:inline-flex{display:inline-flex}.rfs-root.rfs\:h-2, .rfs-root .rfs\:h-2{height:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:h-4, .rfs-root .rfs\:h-4{height:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:h-8, .rfs-root .rfs\:h-8{height:calc(var(--rfs-spacing) * 8)}.rfs-root.rfs\:h-9, .rfs-root .rfs\:h-9{height:calc(var(--rfs-spacing) * 9)}.rfs-root.rfs\:h-full, .rfs-root .rfs\:h-full{height:100%}.rfs-root.rfs\:w-4, .rfs-root .rfs\:w-4{width:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:w-8, .rfs-root .rfs\:w-8{width:calc(var(--rfs-spacing) * 8)}.rfs-root.rfs\:w-72, .rfs-root .rfs\:w-72{width:calc(var(--rfs-spacing) * 72)}.rfs-root.rfs\:w-auto, .rfs-root .rfs\:w-auto{width:auto}.rfs-root.rfs\:min-w-40, .rfs-root .rfs\:min-w-40{min-width:calc(var(--rfs-spacing) * 40)}.rfs-root.rfs\:min-w-72, .rfs-root .rfs\:min-w-72{min-width:calc(var(--rfs-spacing) * 72)}.rfs-root.rfs\:-translate-x-1\/2, .rfs-root .rfs\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rfs-root.rfs\:cursor-grab, .rfs-root .rfs\:cursor-grab{cursor:grab}.rfs-root.rfs\:cursor-grabbing, .rfs-root .rfs\:cursor-grabbing{cursor:grabbing}.rfs-root.rfs\:cursor-ns-resize, .rfs-root .rfs\:cursor-ns-resize{cursor:ns-resize}.rfs-root.rfs\:grid-cols-7, .rfs-root .rfs\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.rfs-root.rfs\:items-center, .rfs-root .rfs\:items-center{align-items:center}.rfs-root.rfs\:justify-between, .rfs-root .rfs\:justify-between{justify-content:space-between}.rfs-root.rfs\:justify-center, .rfs-root .rfs\:justify-center{justify-content:center}.rfs-root.rfs\:justify-start, .rfs-root .rfs\:justify-start{justify-content:flex-start}.rfs-root.rfs\:gap-1, .rfs-root .rfs\:gap-1{gap:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:gap-2, .rfs-root .rfs\:gap-2{gap:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:overflow-hidden, .rfs-root .rfs\:overflow-hidden{overflow:hidden}.rfs-root.rfs\:rounded-full, .rfs-root .rfs\:rounded-full{border-radius:3.40282e38px}.rfs-root.rfs\:rounded-lg, .rfs-root .rfs\:rounded-lg{border-radius:var(--radius)}.rfs-root.rfs\:rounded-md, .rfs-root .rfs\:rounded-md{border-radius:calc(var(--radius) - 2px)}.rfs-root.rfs\:border, .rfs-root .rfs\:border{border-style:var(--tw-border-style);border-width:1px}.rfs-root.rfs\:border-border, .rfs-root .rfs\:border-border,.rfs-root.rfs\:border-border\/50, .rfs-root .rfs\:border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:border-border\/50, .rfs-root .rfs\:border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.rfs-root.rfs\:border-border\/70, .rfs-root .rfs\:border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:border-border\/70, .rfs-root .rfs\:border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.rfs-root.rfs\:bg-background, .rfs-root .rfs\:bg-background{background-color:var(--background)}.rfs-root.rfs\:bg-border\/90, .rfs-root .rfs\:bg-border\/90{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-border\/90, .rfs-root .rfs\:bg-border\/90{background-color:color-mix(in oklab, var(--border) 90%, transparent)}}.rfs-root.rfs\:bg-card, .rfs-root .rfs\:bg-card{background-color:var(--card)}.rfs-root.rfs\:bg-muted\/40, .rfs-root .rfs\:bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-muted\/40, .rfs-root .rfs\:bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.rfs-root.rfs\:bg-popover, .rfs-root .rfs\:bg-popover{background-color:var(--popover)}.rfs-root.rfs\:bg-primary, .rfs-root .rfs\:bg-primary{background-color:var(--primary)}.rfs-root.rfs\:bg-red-100\/80, .rfs-root .rfs\:bg-red-100\/80{background-color:var(--rfs-color-red-100)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-red-100\/80, .rfs-root .rfs\:bg-red-100\/80{background-color:color-mix(in oklab, var(--rfs-color-red-100) 80%, transparent)}}.rfs-root.rfs\:bg-red-600, .rfs-root .rfs\:bg-red-600{background-color:var(--rfs-color-red-600)}.rfs-root.rfs\:p-1, .rfs-root .rfs\:p-1{padding:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:p-2, .rfs-root .rfs\:p-2{padding:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:px-3, .rfs-root .rfs\:px-3{padding-inline:calc(var(--rfs-spacing) * 3)}.rfs-root.rfs\:px-4, .rfs-root .rfs\:px-4{padding-inline:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:py-1, .rfs-root .rfs\:py-1{padding-block:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:py-2, .rfs-root .rfs\:py-2{padding-block:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:pb-5, .rfs-root .rfs\:pb-5{padding-bottom:calc(var(--rfs-spacing) * 5)}.rfs-root.rfs\:text-center, .rfs-root .rfs\:text-center{text-align:center}.rfs-root.rfs\:text-left, .rfs-root .rfs\:text-left{text-align:left}.rfs-root.rfs\:text-sm, .rfs-root .rfs\:text-sm{font-size:var(--rfs-text-sm);line-height:var(--tw-leading,var(--rfs-text-sm--line-height))}.rfs-root.rfs\:text-xs, .rfs-root .rfs\:text-xs{font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height))}.rfs-root.rfs\:text-\[10px\], .rfs-root .rfs\:text-\[10px\]{font-size:10px}.rfs-root.rfs\:font-bold, .rfs-root .rfs\:font-bold{--tw-font-weight:var(--rfs-font-weight-bold);font-weight:var(--rfs-font-weight-bold)}.rfs-root.rfs\:font-medium, .rfs-root .rfs\:font-medium{--tw-font-weight:var(--rfs-font-weight-medium);font-weight:var(--rfs-font-weight-medium)}.rfs-root.rfs\:font-normal, .rfs-root .rfs\:font-normal{--tw-font-weight:var(--rfs-font-weight-normal);font-weight:var(--rfs-font-weight-normal)}.rfs-root.rfs\:font-semibold, .rfs-root .rfs\:font-semibold{--tw-font-weight:var(--rfs-font-weight-semibold);font-weight:var(--rfs-font-weight-semibold)}.rfs-root.rfs\:whitespace-nowrap, .rfs-root .rfs\:whitespace-nowrap{white-space:nowrap}.rfs-root.rfs\:text-foreground, .rfs-root .rfs\:text-foreground{color:var(--foreground)}.rfs-root.rfs\:text-muted-foreground, .rfs-root .rfs\:text-muted-foreground{color:var(--muted-foreground)}.rfs-root.rfs\:text-popover-foreground, .rfs-root .rfs\:text-popover-foreground{color:var(--popover-foreground)}.rfs-root.rfs\:text-primary-foreground, .rfs-root .rfs\:text-primary-foreground{color:var(--primary-foreground)}.rfs-root.rfs\:text-red-950, .rfs-root .rfs\:text-red-950{color:var(--rfs-color-red-950)}.rfs-root.rfs\:text-white, .rfs-root .rfs\:text-white{color:var(--rfs-color-white)}.rfs-root.rfs\:opacity-35, .rfs-root .rfs\:opacity-35{opacity:.35}.rfs-root.rfs\:opacity-55, .rfs-root .rfs\:opacity-55{opacity:.55}.rfs-root.rfs\:opacity-60, .rfs-root .rfs\:opacity-60{opacity:.6}.rfs-root.rfs\:shadow-md, .rfs-root .rfs\:shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:shadow-xl, .rfs-root .rfs\:shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:shadow-xs, .rfs-root .rfs\:shadow-xs{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:transition-colors, .rfs-root .rfs\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--rfs-default-transition-timing-function));transition-duration:var(--tw-duration,var(--rfs-default-transition-duration))}.rfs-root.rfs\:outline-none, .rfs-root .rfs\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.rfs-root.rfs\:hover\:bg-border:hover, .rfs-root .rfs\:hover\:bg-border:hover{background-color:var(--border)}.rfs-root.rfs\:hover\:bg-muted:hover, .rfs-root .rfs\:hover\:bg-muted:hover{background-color:var(--muted)}.rfs-root.rfs\:hover\:bg-primary\/90:hover, .rfs-root .rfs\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:hover\:bg-primary\/90:hover, .rfs-root .rfs\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}}.rfs-root.rfs\:focus-visible\:ring-2:focus-visible, .rfs-root .rfs\:focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:focus-visible\:ring-ring:focus-visible, .rfs-root .rfs\:focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.rfs-root.rfs\:focus-visible\:ring-offset-2:focus-visible, .rfs-root .rfs\:focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.rfs-root.rfs\:focus-visible\:outline-none:focus-visible, .rfs-root .rfs\:focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.rfs-root.rfs\:disabled\:pointer-events-none:disabled, .rfs-root .rfs\:disabled\:pointer-events-none:disabled{pointer-events:none}.rfs-root.rfs\:disabled\:opacity-50:disabled, .rfs-root .rfs\:disabled\:opacity-50:disabled{opacity:.5}.rfs-root.rfs\:dark\:bg-muted\/30:is(.dark *), .rfs-root .rfs\:dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:dark\:bg-muted\/30:is(.dark *), .rfs-root .rfs\:dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.rfs-root.rfs\:dark\:bg-red-950\/40:is(.dark *), .rfs-root .rfs\:dark\:bg-red-950\/40:is(.dark *){background-color:var(--rfs-color-red-950)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:dark\:bg-red-950\/40:is(.dark *), .rfs-root .rfs\:dark\:bg-red-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--rfs-color-red-950) 40%, transparent)}}.rfs-root.rfs\:dark\:text-red-100:is(.dark *), .rfs-root .rfs\:dark\:text-red-100:is(.dark *){color:var(--rfs-color-red-100)}}.rfs-root{--topbar-h:39px;--header-h:87px;--footer-h:359px;--site-content-min-h:calc(100dvh - var(--topbar-h) - var(--header-h) - var(--footer-h));--background:oklch(100% 0 0);--foreground:oklch(21.93% .0122 145.145);--card:oklch(100% 0 0);--card-foreground:oklch(21.93% .0122 145.145);--popover:oklch(100% 0 0);--popover-foreground:oklch(21.93% .0122 145.145);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(100% 0 0);--secondary:oklch(96.07% .0112 141.263);--secondary-foreground:oklch(44.45% .0502 141.758);--muted:oklch(96.07% .0112 141.263);--muted-foreground:oklch(53.51% .0432 142.652);--accent:oklch(96.07% .0112 141.263);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(68.07% .1129 109.059);--destructive-foreground:oklch(100% 0 0);--border:oklch(91% .021 140.896);--input:oklch(91% .021 140.896);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(60.42% .0688 140.724);--chart-3:oklch(84.06% .0531 141.655);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(91% .021 140.896);--sidebar:oklch(97.77% .0078 139.442);--sidebar-foreground:oklch(21.93% .0122 145.145);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(91% .021 140.896);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(91% .021 140.896);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:4px;--shadow-blur:10px;--shadow-spread:0px;--shadow-opacity:.05;--shadow-color:0 0 0;--shadow-2xs:0px 4px 10px 0px #00000008;--shadow-xs:0px 4px 10px 0px #00000008;--shadow-sm:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow-md:0px 4px 10px 0px #0000000d, 0px 2px 4px -1px #0000000d;--shadow-lg:0px 4px 10px 0px #0000000d, 0px 4px 6px -1px #0000000d;--shadow-xl:0px 4px 10px 0px #0000000d, 0px 8px 10px -1px #0000000d;--shadow-2xl:0px 4px 10px 0px #00000021;--tracking-normal:.01em;--spacing:.3rem;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.dark .rfs-root,.rfs-root.dark{--background:oklch(21.93% .0122 145.145);--foreground:oklch(96.07% .0112 141.263);--card:oklch(21.93% .0122 145.145);--card-foreground:oklch(96.07% .0112 141.263);--popover:oklch(21.93% .0122 145.145);--popover-foreground:oklch(96.07% .0112 141.263);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(21.93% .0122 145.145);--secondary:oklch(27.44% .0184 145.053);--secondary-foreground:oklch(84.06% .0531 141.655);--muted:oklch(27.44% .0184 145.053);--muted-foreground:oklch(60.42% .0688 140.724);--accent:oklch(27.44% .0184 145.053);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(88.44% .1663 107.49);--destructive-foreground:oklch(100% 0 0);--border:oklch(27.44% .0184 145.053);--input:oklch(27.44% .0184 145.053);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(84.06% .0531 141.655);--chart-3:oklch(60.42% .0688 140.724);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(35.96% .0355 143.305);--sidebar:oklch(21.93% .0122 145.145);--sidebar-foreground:oklch(96.07% .0112 141.263);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(21.93% .0122 145.145);--sidebar-accent:oklch(27.44% .0184 145.053);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(27.44% .0184 145.053);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:10px;--shadow-blur:20px;--shadow-spread:0px;--shadow-opacity:.4;--shadow-color:0 0 0;--shadow-2xs:0px 10px 20px 0px #0003;--shadow-xs:0px 10px 20px 0px #0003;--shadow-sm:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow-md:0px 10px 20px 0px #0006, 0px 2px 4px -1px #0006;--shadow-lg:0px 10px 20px 0px #0006, 0px 4px 6px -1px #0006;--shadow-xl:0px 10px 20px 0px #0006, 0px 8px 10px -1px #0006;--shadow-2xl:0px 10px 20px 0px #000;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.rfs-root{font-size:var(--rfs-text-sm);line-height:var(--tw-leading,var(--rfs-text-sm--line-height));color:var(--rfs-text)}.rfs-root--drag-move{cursor:grabbing;-webkit-user-select:none;user-select:none}.rfs-root--drag-resize{cursor:ns-resize;-webkit-user-select:none;user-select:none}.rfs-root.rfs-card-slot--ghost, .rfs-root .rfs-card-slot--ghost{z-index:10;pointer-events:none}.rfs-root.rfs-card-slot--dragging, .rfs-root .rfs-card-slot--dragging{z-index:30}.rfs-root.rfs-drag-overlay, .rfs-root .rfs-drag-overlay{z-index:60;pointer-events:none;position:fixed}.rfs-root.rfs-toolbar, .rfs-root .rfs-toolbar{margin-bottom:calc(var(--rfs-spacing) * 3);align-items:center;gap:calc(var(--rfs-spacing) * 2);display:flex}.rfs-root.rfs-btn, .rfs-root .rfs-btn{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--rfs-default-transition-timing-function));transition-duration:var(--tw-duration,var(--rfs-default-transition-duration));background:var(--rfs-surface);border-width:1px}.rfs-root.rfs-btn:hover, .rfs-root .rfs-btn:hover{background:var(--rfs-bg)}.rfs-root.rfs-btn:disabled, .rfs-root .rfs-btn:disabled{cursor:not-allowed;opacity:.5}.rfs-root.rfs-date-label, .rfs-root .rfs-date-label{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));--tw-font-weight:var(--rfs-font-weight-semibold);font-weight:var(--rfs-font-weight-semibold);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-root.rfs-shell, .rfs-root .rfs-shell{border-radius:var(--radius);border-style:var(--tw-border-style);background:var(--rfs-surface);border-width:1px;overflow-x:auto}.rfs-root.rfs-header, .rfs-root .rfs-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--rfs-border);display:flex}.rfs-root.rfs-gutter, .rfs-root .rfs-gutter{left:calc(var(--rfs-spacing) * 0);z-index:20;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky}.rfs-root.rfs-resource-header, .rfs-root .rfs-resource-header{border-right-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 2);border-right-width:1px;border-color:var(--rfs-border)}.rfs-root.rfs-resource-subtitle, .rfs-root .rfs-resource-subtitle{margin-top:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));color:var(--rfs-muted)}.rfs-root.rfs-body, .rfs-root .rfs-body{display:flex}.rfs-root.rfs-times, .rfs-root .rfs-times{left:calc(var(--rfs-spacing) * 0);z-index:10;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky;box-shadow:8px 0 12px -12px #0000002e}.rfs-root.rfs-time-tick, .rfs-root .rfs-time-tick{left:calc(var(--rfs-spacing) * 1);color:var(--rfs-muted);font-size:11px;position:absolute}.rfs-root.rfs-grid, .rfs-root .rfs-grid{flex:1;display:flex}.rfs-root.rfs-col, .rfs-root .rfs-col{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border)}.rfs-root.rfs-col-inner, .rfs-root .rfs-col-inner{position:relative}.rfs-root.rfs-hour-line, .rfs-root .rfs-hour-line,.rfs-root.rfs-slot-line, .rfs-root .rfs-slot-line{right:calc(var(--rfs-spacing) * 0);left:calc(var(--rfs-spacing) * 0);border-top-style:var(--tw-border-style);--tw-border-style:dotted;border-style:dotted;border-top-width:1px;border-color:var(--rfs-border);opacity:.5;position:absolute}.rfs-root.rfs-card-slot, .rfs-root .rfs-card-slot{padding:calc(var(--rfs-spacing) * .5);position:absolute}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.rfs-root, .rfs-root *,.rfs-root :before,.rfs-root :after,.rfs-root::backdrop, .rfs-root ::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{.rfs-root,.rfs-root{--rfs-color-red-100:oklch(93.6% .032 17.717);--rfs-color-red-600:oklch(57.7% .245 27.325);--rfs-color-red-950:oklch(25.8% .092 26.042);--rfs-color-white:#fff;--rfs-spacing:.25rem;--rfs-text-xs:.75rem;--rfs-text-xs--line-height:calc(1 / .75);--rfs-text-sm:.875rem;--rfs-text-sm--line-height:calc(1.25 / .875);--rfs-font-weight-normal:400;--rfs-font-weight-medium:500;--rfs-font-weight-semibold:600;--rfs-font-weight-bold:700;--rfs-default-transition-duration:.15s;--rfs-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--rfs-default-font-family:var(--font-sans);--rfs-default-mono-font-family:var(--font-mono)}}@layer base{.rfs-root, .rfs-root *,.rfs-root :after,.rfs-root :before,.rfs-root::backdrop, .rfs-root ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.rfs-root,.rfs-root{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--rfs-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--rfs-default-font-feature-settings,normal);font-variation-settings:var(--rfs-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}.rfs-root hr{height:0;color:inherit;border-top-width:1px}.rfs-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.rfs-root h1,.rfs-root h2,.rfs-root h3,.rfs-root h4,.rfs-root h5,.rfs-root h6{font-size:inherit;font-weight:inherit}.rfs-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.rfs-root b,.rfs-root strong{font-weight:bolder}.rfs-root code,.rfs-root kbd,.rfs-root samp,.rfs-root pre{font-family:var(--rfs-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--rfs-default-mono-font-feature-settings,normal);font-variation-settings:var(--rfs-default-mono-font-variation-settings,normal);font-size:1em}.rfs-root small{font-size:80%}.rfs-root sub,.rfs-root sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}.rfs-root sub{bottom:-.25em}.rfs-root sup{top:-.5em}.rfs-root table{text-indent:0;border-color:inherit;border-collapse:collapse}.rfs-root :-moz-focusring{outline:auto}.rfs-root progress{vertical-align:baseline}.rfs-root summary{display:list-item}.rfs-root ol,.rfs-root ul,.rfs-root menu{list-style:none}.rfs-root img,.rfs-root svg,.rfs-root video,.rfs-root canvas,.rfs-root audio,.rfs-root iframe,.rfs-root embed,.rfs-root object{vertical-align:middle;display:block}.rfs-root img,.rfs-root video{max-width:100%;height:auto}.rfs-root button,.rfs-root input,.rfs-root select,.rfs-root optgroup,.rfs-root textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}.rfs-root :where(select:is([multiple],[size])) optgroup{font-weight:bolder}.rfs-root :where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{margin-inline-end:4px}.rfs-root::placeholder, .rfs-root ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){.rfs-root::placeholder, .rfs-root ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){.rfs-root::placeholder, .rfs-root ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}.rfs-root textarea{resize:vertical}.rfs-root::-webkit-search-decoration, .rfs-root ::-webkit-search-decoration{-webkit-appearance:none}.rfs-root::-webkit-date-and-time-value, .rfs-root ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}.rfs-root::-webkit-datetime-edit, .rfs-root ::-webkit-datetime-edit{display:inline-flex}.rfs-root::-webkit-datetime-edit-fields-wrapper, .rfs-root ::-webkit-datetime-edit-fields-wrapper{padding:0}.rfs-root::-webkit-datetime-edit, .rfs-root ::-webkit-datetime-edit{padding-block:0}.rfs-root::-webkit-datetime-edit-year-field, .rfs-root ::-webkit-datetime-edit-year-field{padding-block:0}.rfs-root::-webkit-datetime-edit-month-field, .rfs-root ::-webkit-datetime-edit-month-field{padding-block:0}.rfs-root::-webkit-datetime-edit-day-field, .rfs-root ::-webkit-datetime-edit-day-field{padding-block:0}.rfs-root::-webkit-datetime-edit-hour-field, .rfs-root ::-webkit-datetime-edit-hour-field{padding-block:0}.rfs-root::-webkit-datetime-edit-minute-field, .rfs-root ::-webkit-datetime-edit-minute-field{padding-block:0}.rfs-root::-webkit-datetime-edit-second-field, .rfs-root ::-webkit-datetime-edit-second-field{padding-block:0}.rfs-root::-webkit-datetime-edit-millisecond-field, .rfs-root ::-webkit-datetime-edit-millisecond-field{padding-block:0}.rfs-root::-webkit-datetime-edit-meridiem-field, .rfs-root ::-webkit-datetime-edit-meridiem-field{padding-block:0}.rfs-root::-webkit-calendar-picker-indicator, .rfs-root ::-webkit-calendar-picker-indicator{line-height:1}.rfs-root :-moz-ui-invalid{box-shadow:none}.rfs-root button,.rfs-root input:where([type=button],[type=reset],[type=submit]){appearance:button}.rfs-root::file-selector-button, .rfs-root ::file-selector-button{appearance:button}.rfs-root::-webkit-inner-spin-button, .rfs-root ::-webkit-inner-spin-button{height:auto}.rfs-root::-webkit-outer-spin-button, .rfs-root ::-webkit-outer-spin-button{height:auto}.rfs-root [hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.rfs-root.rfs\:absolute, .rfs-root .rfs\:absolute{position:absolute}.rfs-root.rfs\:relative, .rfs-root .rfs\:relative{position:relative}.rfs-root.rfs\:inset-x-1, .rfs-root .rfs\:inset-x-1{inset-inline:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:top-1, .rfs-root .rfs\:top-1{top:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:top-full, .rfs-root .rfs\:top-full{top:100%}.rfs-root.rfs\:right-0, .rfs-root .rfs\:right-0{right:calc(var(--rfs-spacing) * 0)}.rfs-root.rfs\:right-1, .rfs-root .rfs\:right-1{right:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:bottom-1, .rfs-root .rfs\:bottom-1{bottom:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:left-0, .rfs-root .rfs\:left-0{left:calc(var(--rfs-spacing) * 0)}.rfs-root.rfs\:left-1\/2, .rfs-root .rfs\:left-1\/2{left:50%}.rfs-root.rfs\:z-50, .rfs-root .rfs\:z-50{z-index:50}.rfs-root.rfs\:mt-1, .rfs-root .rfs\:mt-1{margin-top:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:mt-2, .rfs-root .rfs\:mt-2{margin-top:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:mb-2, .rfs-root .rfs\:mb-2{margin-bottom:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:flex, .rfs-root .rfs\:flex{display:flex}.rfs-root.rfs\:grid, .rfs-root .rfs\:grid{display:grid}.rfs-root.rfs\:inline-flex, .rfs-root .rfs\:inline-flex{display:inline-flex}.rfs-root.rfs\:h-2, .rfs-root .rfs\:h-2{height:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:h-4, .rfs-root .rfs\:h-4{height:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:h-8, .rfs-root .rfs\:h-8{height:calc(var(--rfs-spacing) * 8)}.rfs-root.rfs\:h-9, .rfs-root .rfs\:h-9{height:calc(var(--rfs-spacing) * 9)}.rfs-root.rfs\:h-full, .rfs-root .rfs\:h-full{height:100%}.rfs-root.rfs\:w-4, .rfs-root .rfs\:w-4{width:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:w-8, .rfs-root .rfs\:w-8{width:calc(var(--rfs-spacing) * 8)}.rfs-root.rfs\:w-72, .rfs-root .rfs\:w-72{width:calc(var(--rfs-spacing) * 72)}.rfs-root.rfs\:w-auto, .rfs-root .rfs\:w-auto{width:auto}.rfs-root.rfs\:min-w-40, .rfs-root .rfs\:min-w-40{min-width:calc(var(--rfs-spacing) * 40)}.rfs-root.rfs\:min-w-72, .rfs-root .rfs\:min-w-72{min-width:calc(var(--rfs-spacing) * 72)}.rfs-root.rfs\:-translate-x-1\/2, .rfs-root .rfs\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rfs-root.rfs\:cursor-grab, .rfs-root .rfs\:cursor-grab{cursor:grab}.rfs-root.rfs\:cursor-grabbing, .rfs-root .rfs\:cursor-grabbing{cursor:grabbing}.rfs-root.rfs\:cursor-ns-resize, .rfs-root .rfs\:cursor-ns-resize{cursor:ns-resize}.rfs-root.rfs\:grid-cols-7, .rfs-root .rfs\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.rfs-root.rfs\:items-center, .rfs-root .rfs\:items-center{align-items:center}.rfs-root.rfs\:justify-between, .rfs-root .rfs\:justify-between{justify-content:space-between}.rfs-root.rfs\:justify-center, .rfs-root .rfs\:justify-center{justify-content:center}.rfs-root.rfs\:justify-start, .rfs-root .rfs\:justify-start{justify-content:flex-start}.rfs-root.rfs\:gap-1, .rfs-root .rfs\:gap-1{gap:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:gap-2, .rfs-root .rfs\:gap-2{gap:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:overflow-hidden, .rfs-root .rfs\:overflow-hidden{overflow:hidden}.rfs-root.rfs\:rounded-full, .rfs-root .rfs\:rounded-full{border-radius:3.40282e38px}.rfs-root.rfs\:rounded-lg, .rfs-root .rfs\:rounded-lg{border-radius:var(--radius)}.rfs-root.rfs\:rounded-md, .rfs-root .rfs\:rounded-md{border-radius:calc(var(--radius) - 2px)}.rfs-root.rfs\:border, .rfs-root .rfs\:border{border-style:var(--tw-border-style);border-width:1px}.rfs-root.rfs\:border-border, .rfs-root .rfs\:border-border,.rfs-root.rfs\:border-border\/50, .rfs-root .rfs\:border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:border-border\/50, .rfs-root .rfs\:border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.rfs-root.rfs\:border-border\/70, .rfs-root .rfs\:border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:border-border\/70, .rfs-root .rfs\:border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.rfs-root.rfs\:bg-border\/90, .rfs-root .rfs\:bg-border\/90{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-border\/90, .rfs-root .rfs\:bg-border\/90{background-color:color-mix(in oklab, var(--border) 90%, transparent)}}.rfs-root.rfs\:bg-card, .rfs-root .rfs\:bg-card{background-color:var(--card)}.rfs-root.rfs\:bg-muted\/40, .rfs-root .rfs\:bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-muted\/40, .rfs-root .rfs\:bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.rfs-root.rfs\:bg-popover, .rfs-root .rfs\:bg-popover{background-color:var(--popover)}.rfs-root.rfs\:bg-primary, .rfs-root .rfs\:bg-primary{background-color:var(--primary)}.rfs-root.rfs\:bg-red-100\/80, .rfs-root .rfs\:bg-red-100\/80{background-color:var(--rfs-color-red-100)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:bg-red-100\/80, .rfs-root .rfs\:bg-red-100\/80{background-color:color-mix(in oklab, var(--rfs-color-red-100) 80%, transparent)}}.rfs-root.rfs\:bg-red-600, .rfs-root .rfs\:bg-red-600{background-color:var(--rfs-color-red-600)}.rfs-root.rfs\:p-1, .rfs-root .rfs\:p-1{padding:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:p-2, .rfs-root .rfs\:p-2{padding:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:px-3, .rfs-root .rfs\:px-3{padding-inline:calc(var(--rfs-spacing) * 3)}.rfs-root.rfs\:px-4, .rfs-root .rfs\:px-4{padding-inline:calc(var(--rfs-spacing) * 4)}.rfs-root.rfs\:py-1, .rfs-root .rfs\:py-1{padding-block:calc(var(--rfs-spacing) * 1)}.rfs-root.rfs\:py-2, .rfs-root .rfs\:py-2{padding-block:calc(var(--rfs-spacing) * 2)}.rfs-root.rfs\:pb-5, .rfs-root .rfs\:pb-5{padding-bottom:calc(var(--rfs-spacing) * 5)}.rfs-root.rfs\:text-center, .rfs-root .rfs\:text-center{text-align:center}.rfs-root.rfs\:text-left, .rfs-root .rfs\:text-left{text-align:left}.rfs-root.rfs\:text-sm, .rfs-root .rfs\:text-sm{font-size:var(--rfs-text-sm);line-height:var(--tw-leading,var(--rfs-text-sm--line-height))}.rfs-root.rfs\:text-xs, .rfs-root .rfs\:text-xs{font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height))}.rfs-root.rfs\:text-\[10px\], .rfs-root .rfs\:text-\[10px\]{font-size:10px}.rfs-root.rfs\:font-bold, .rfs-root .rfs\:font-bold{--tw-font-weight:var(--rfs-font-weight-bold);font-weight:var(--rfs-font-weight-bold)}.rfs-root.rfs\:font-medium, .rfs-root .rfs\:font-medium{--tw-font-weight:var(--rfs-font-weight-medium);font-weight:var(--rfs-font-weight-medium)}.rfs-root.rfs\:font-normal, .rfs-root .rfs\:font-normal{--tw-font-weight:var(--rfs-font-weight-normal);font-weight:var(--rfs-font-weight-normal)}.rfs-root.rfs\:font-semibold, .rfs-root .rfs\:font-semibold{--tw-font-weight:var(--rfs-font-weight-semibold);font-weight:var(--rfs-font-weight-semibold)}.rfs-root.rfs\:whitespace-nowrap, .rfs-root .rfs\:whitespace-nowrap{white-space:nowrap}.rfs-root.rfs\:text-foreground, .rfs-root .rfs\:text-foreground{color:var(--foreground)}.rfs-root.rfs\:text-muted-foreground, .rfs-root .rfs\:text-muted-foreground{color:var(--muted-foreground)}.rfs-root.rfs\:text-popover-foreground, .rfs-root .rfs\:text-popover-foreground{color:var(--popover-foreground)}.rfs-root.rfs\:text-primary-foreground, .rfs-root .rfs\:text-primary-foreground{color:var(--primary-foreground)}.rfs-root.rfs\:text-red-950, .rfs-root .rfs\:text-red-950{color:var(--rfs-color-red-950)}.rfs-root.rfs\:text-white, .rfs-root .rfs\:text-white{color:var(--rfs-color-white)}.rfs-root.rfs\:opacity-35, .rfs-root .rfs\:opacity-35{opacity:.35}.rfs-root.rfs\:opacity-55, .rfs-root .rfs\:opacity-55{opacity:.55}.rfs-root.rfs\:opacity-60, .rfs-root .rfs\:opacity-60{opacity:.6}.rfs-root.rfs\:shadow-md, .rfs-root .rfs\:shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:shadow-xl, .rfs-root .rfs\:shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:shadow-xs, .rfs-root .rfs\:shadow-xs{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:transition-colors, .rfs-root .rfs\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--rfs-default-transition-timing-function));transition-duration:var(--tw-duration,var(--rfs-default-transition-duration))}.rfs-root.rfs\:outline-none, .rfs-root .rfs\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.rfs-root.rfs\:hover\:bg-border:hover, .rfs-root .rfs\:hover\:bg-border:hover{background-color:var(--border)}.rfs-root.rfs\:hover\:bg-muted:hover, .rfs-root .rfs\:hover\:bg-muted:hover{background-color:var(--muted)}.rfs-root.rfs\:hover\:bg-primary\/90:hover, .rfs-root .rfs\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:hover\:bg-primary\/90:hover, .rfs-root .rfs\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}}.rfs-root.rfs\:focus-visible\:ring-2:focus-visible, .rfs-root .rfs\:focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.rfs-root.rfs\:focus-visible\:ring-ring:focus-visible, .rfs-root .rfs\:focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.rfs-root.rfs\:focus-visible\:ring-offset-2:focus-visible, .rfs-root .rfs\:focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.rfs-root.rfs\:focus-visible\:outline-none:focus-visible, .rfs-root .rfs\:focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.rfs-root.rfs\:disabled\:pointer-events-none:disabled, .rfs-root .rfs\:disabled\:pointer-events-none:disabled{pointer-events:none}.rfs-root.rfs\:disabled\:opacity-50:disabled, .rfs-root .rfs\:disabled\:opacity-50:disabled{opacity:.5}.rfs-root.rfs\:dark\:bg-muted\/30:is(.dark *), .rfs-root .rfs\:dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:dark\:bg-muted\/30:is(.dark *), .rfs-root .rfs\:dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.rfs-root.rfs\:dark\:bg-red-950\/40:is(.dark *), .rfs-root .rfs\:dark\:bg-red-950\/40:is(.dark *){background-color:var(--rfs-color-red-950)}@supports (color:color-mix(in lab, red, red)){.rfs-root.rfs\:dark\:bg-red-950\/40:is(.dark *), .rfs-root .rfs\:dark\:bg-red-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--rfs-color-red-950) 40%, transparent)}}.rfs-root.rfs\:dark\:text-red-100:is(.dark *), .rfs-root .rfs\:dark\:text-red-100:is(.dark *){color:var(--rfs-color-red-100)}}.rfs-root{--topbar-h:39px;--header-h:87px;--footer-h:359px;--site-content-min-h:calc(100dvh - var(--topbar-h) - var(--header-h) - var(--footer-h));--background:oklch(100% 0 0);--foreground:oklch(21.93% .0122 145.145);--card:oklch(100% 0 0);--card-foreground:oklch(21.93% .0122 145.145);--popover:oklch(100% 0 0);--popover-foreground:oklch(21.93% .0122 145.145);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(100% 0 0);--secondary:oklch(96.07% .0112 141.263);--secondary-foreground:oklch(44.45% .0502 141.758);--muted:oklch(96.07% .0112 141.263);--muted-foreground:oklch(53.51% .0432 142.652);--accent:oklch(96.07% .0112 141.263);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(68.07% .1129 109.059);--destructive-foreground:oklch(100% 0 0);--border:oklch(91% .021 140.896);--input:oklch(91% .021 140.896);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(60.42% .0688 140.724);--chart-3:oklch(84.06% .0531 141.655);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(91% .021 140.896);--sidebar:oklch(97.77% .0078 139.442);--sidebar-foreground:oklch(21.93% .0122 145.145);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(91% .021 140.896);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(91% .021 140.896);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:4px;--shadow-blur:10px;--shadow-spread:0px;--shadow-opacity:.05;--shadow-color:0 0 0;--shadow-2xs:0px 4px 10px 0px #00000008;--shadow-xs:0px 4px 10px 0px #00000008;--shadow-sm:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow-md:0px 4px 10px 0px #0000000d, 0px 2px 4px -1px #0000000d;--shadow-lg:0px 4px 10px 0px #0000000d, 0px 4px 6px -1px #0000000d;--shadow-xl:0px 4px 10px 0px #0000000d, 0px 8px 10px -1px #0000000d;--shadow-2xl:0px 4px 10px 0px #00000021;--tracking-normal:.01em;--spacing:.3rem;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.dark .rfs-root,.rfs-root.dark{--background:oklch(21.93% .0122 145.145);--foreground:oklch(96.07% .0112 141.263);--card:oklch(21.93% .0122 145.145);--card-foreground:oklch(96.07% .0112 141.263);--popover:oklch(21.93% .0122 145.145);--popover-foreground:oklch(96.07% .0112 141.263);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(21.93% .0122 145.145);--secondary:oklch(27.44% .0184 145.053);--secondary-foreground:oklch(84.06% .0531 141.655);--muted:oklch(27.44% .0184 145.053);--muted-foreground:oklch(60.42% .0688 140.724);--accent:oklch(27.44% .0184 145.053);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(88.44% .1663 107.49);--destructive-foreground:oklch(100% 0 0);--border:oklch(27.44% .0184 145.053);--input:oklch(27.44% .0184 145.053);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(84.06% .0531 141.655);--chart-3:oklch(60.42% .0688 140.724);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(35.96% .0355 143.305);--sidebar:oklch(21.93% .0122 145.145);--sidebar-foreground:oklch(96.07% .0112 141.263);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(21.93% .0122 145.145);--sidebar-accent:oklch(27.44% .0184 145.053);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(27.44% .0184 145.053);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:10px;--shadow-blur:20px;--shadow-spread:0px;--shadow-opacity:.4;--shadow-color:0 0 0;--shadow-2xs:0px 10px 20px 0px #0003;--shadow-xs:0px 10px 20px 0px #0003;--shadow-sm:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow-md:0px 10px 20px 0px #0006, 0px 2px 4px -1px #0006;--shadow-lg:0px 10px 20px 0px #0006, 0px 4px 6px -1px #0006;--shadow-xl:0px 10px 20px 0px #0006, 0px 8px 10px -1px #0006;--shadow-2xl:0px 10px 20px 0px #000;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.rfs-root{font-size:var(--rfs-text-sm);line-height:var(--tw-leading,var(--rfs-text-sm--line-height));color:var(--rfs-text)}.rfs-root--drag-move{cursor:grabbing;-webkit-user-select:none;user-select:none}.rfs-root--drag-resize{cursor:ns-resize;-webkit-user-select:none;user-select:none}.rfs-root.rfs-card-slot--ghost, .rfs-root .rfs-card-slot--ghost{z-index:10;pointer-events:none}.rfs-root.rfs-card-slot--dragging, .rfs-root .rfs-card-slot--dragging{z-index:30}.rfs-root.rfs-drag-overlay, .rfs-root .rfs-drag-overlay{z-index:60;pointer-events:none;position:fixed}.rfs-root.rfs-toolbar, .rfs-root .rfs-toolbar{margin-bottom:calc(var(--rfs-spacing) * 3);align-items:center;gap:calc(var(--rfs-spacing) * 2);display:flex}.rfs-root.rfs-btn, .rfs-root .rfs-btn{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--rfs-default-transition-timing-function));transition-duration:var(--tw-duration,var(--rfs-default-transition-duration));background:var(--rfs-surface);border-width:1px}.rfs-root.rfs-btn:hover, .rfs-root .rfs-btn:hover{background:var(--rfs-bg)}.rfs-root.rfs-btn:disabled, .rfs-root .rfs-btn:disabled{cursor:not-allowed;opacity:.5}.rfs-root.rfs-date-label, .rfs-root .rfs-date-label{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));--tw-font-weight:var(--rfs-font-weight-semibold);font-weight:var(--rfs-font-weight-semibold);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-root.rfs-shell, .rfs-root .rfs-shell{border-radius:var(--radius);border-style:var(--tw-border-style);background:var(--rfs-surface);border-width:1px;overflow-x:auto}.rfs-root.rfs-header, .rfs-root .rfs-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--rfs-border);display:flex}.rfs-root.rfs-gutter, .rfs-root .rfs-gutter{left:calc(var(--rfs-spacing) * 0);z-index:20;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky}.rfs-root.rfs-resource-header, .rfs-root .rfs-resource-header{border-right-style:var(--tw-border-style);padding-inline:calc(var(--rfs-spacing) * 2);padding-block:calc(var(--rfs-spacing) * 2);border-right-width:1px;border-color:var(--rfs-border)}.rfs-root.rfs-resource-subtitle, .rfs-root .rfs-resource-subtitle{margin-top:calc(var(--rfs-spacing) * 1);font-size:var(--rfs-text-xs);line-height:var(--tw-leading,var(--rfs-text-xs--line-height));color:var(--rfs-muted)}.rfs-root.rfs-body, .rfs-root .rfs-body{display:flex}.rfs-root.rfs-times, .rfs-root .rfs-times{left:calc(var(--rfs-spacing) * 0);z-index:10;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky;box-shadow:8px 0 12px -12px #0000002e}.rfs-root.rfs-time-tick, .rfs-root .rfs-time-tick{left:calc(var(--rfs-spacing) * 1);color:var(--rfs-muted);font-size:11px;position:absolute}.rfs-root.rfs-grid, .rfs-root .rfs-grid{flex:1;display:flex}.rfs-root.rfs-col, .rfs-root .rfs-col{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border)}.rfs-root.rfs-col-inner, .rfs-root .rfs-col-inner{position:relative}.rfs-root.rfs-hour-line, .rfs-root .rfs-hour-line,.rfs-root.rfs-slot-line, .rfs-root .rfs-slot-line{right:calc(var(--rfs-spacing) * 0);left:calc(var(--rfs-spacing) * 0);border-top-style:var(--tw-border-style);--tw-border-style:dotted;border-style:dotted;border-top-width:1px;border-color:var(--rfs-border);opacity:.5;position:absolute}.rfs-root.rfs-card-slot, .rfs-root .rfs-card-slot{padding:calc(var(--rfs-spacing) * .5);position:absolute}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marco.colia/react-fast-scheduler",
3
- "version": "3.0.0",
3
+ "version": "3.2.0",
4
4
  "description": "A lightweight React scheduling library.",
5
5
  "keywords": [
6
6
  "react",