@marco.colia/react-fast-scheduler 2.2.2 → 3.0.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 +15 -9
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -29,6 +29,10 @@ Import the packaged styles once in your app:
|
|
|
29
29
|
import "@marco.colia/react-fast-scheduler/styles.css";
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
+
The packaged stylesheet is scoped to the scheduler wrapper, so it does not write theme tokens to your app `:root` or reuse unprefixed Tailwind utility names.
|
|
33
|
+
|
|
34
|
+
When you pass your own class strings through props like `resourceAppointmentClassMap`, `appointmentColorTokenClassMap`, or a custom `renderAppointment`, those classes belong to your app and can use your own Tailwind setup.
|
|
35
|
+
|
|
32
36
|
## Quick Start
|
|
33
37
|
|
|
34
38
|
The scheduler is a controlled component:
|
|
@@ -274,10 +278,10 @@ The package ships precompiled CSS:
|
|
|
274
278
|
import "@marco.colia/react-fast-scheduler/styles.css";
|
|
275
279
|
```
|
|
276
280
|
|
|
277
|
-
You can override the exposed CSS variables
|
|
281
|
+
You can override the exposed CSS variables on the scheduler wrapper:
|
|
278
282
|
|
|
279
283
|
```css
|
|
280
|
-
|
|
284
|
+
.rfs-root {
|
|
281
285
|
--rfs-bg: #f8fafc;
|
|
282
286
|
--rfs-surface: #ffffff;
|
|
283
287
|
--rfs-border: #e2e8f0;
|
|
@@ -286,6 +290,8 @@ You can override the exposed CSS variables in your app:
|
|
|
286
290
|
}
|
|
287
291
|
```
|
|
288
292
|
|
|
293
|
+
If you want a dark override, target `.dark .rfs-root`.
|
|
294
|
+
|
|
289
295
|
### Resource-based colors
|
|
290
296
|
|
|
291
297
|
The simplest option is `resourceAppointmentClassMap`:
|
|
@@ -300,6 +306,8 @@ The simplest option is `resourceAppointmentClassMap`:
|
|
|
300
306
|
/>
|
|
301
307
|
```
|
|
302
308
|
|
|
309
|
+
Those class names are consumer-provided and are expected to come from your app stylesheet or Tailwind build.
|
|
310
|
+
|
|
303
311
|
If you want semantic mapping, use `getResourceAppointmentColorToken` plus `appointmentColorTokenClassMap`:
|
|
304
312
|
|
|
305
313
|
```tsx
|
|
@@ -345,18 +353,16 @@ The renderer also receives:
|
|
|
345
353
|
}) => (
|
|
346
354
|
<div
|
|
347
355
|
onPointerDown={onPointerDown}
|
|
348
|
-
className={`relative h-full overflow-hidden rounded-md
|
|
356
|
+
className={`relative h-full overflow-hidden rounded-md p-2 pb-5 ${
|
|
349
357
|
appointment.visualState === "ghost"
|
|
350
|
-
? "cursor-grab
|
|
358
|
+
? "cursor-grab opacity-55"
|
|
351
359
|
: appointment.visualState === "dragging"
|
|
352
|
-
? "cursor-grabbing opacity-55"
|
|
360
|
+
? "cursor-grabbing opacity-55 shadow-sm"
|
|
353
361
|
: "cursor-grab"
|
|
354
362
|
} ${
|
|
355
363
|
isDropInvalid
|
|
356
|
-
? "
|
|
357
|
-
:
|
|
358
|
-
appointmentAppearance?.className ?? appointmentBackgroundColor ?? "bg-slate-100"
|
|
359
|
-
}`
|
|
364
|
+
? "bg-red-100/80 text-red-950"
|
|
365
|
+
: appointmentAppearance?.className ?? appointmentBackgroundColor ?? "bg-slate-100"
|
|
360
366
|
}`}
|
|
361
367
|
>
|
|
362
368
|
<div className="text-xs font-semibold">{appointment.title}</div>
|
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??"bg-muted/40 dark:bg-muted/30",f=t?"border-red-500 bg-red-100/80 text-red-950 ring-1 ring-red-500/60 dark:bg-red-950/40 dark:text-red-100":"",p=e.visualState==="ghost"?"cursor-grab border-dashed opacity-35":e.visualState==="dragging"?"cursor-grabbing opacity-55 shadow-xl ring-1 ring-border/70":"cursor-grab",R=`relative h-full overflow-hidden rounded-md border border-border p-2 pb-5 text-foreground ${d} ${f} ${p}`;return jsxRuntime.jsxs("div",{onPointerDown:r,className:R,children:[t?jsxRuntime.jsx("div",{className:"absolute right-1 top-1 flex h-4 w-4 items-center justify-center rounded-full bg-red-600 text-[10px] font-bold text-white",children:"X"}):null,jsxRuntime.jsx("div",{className:"text-xs font-semibold",children:e.title}),a?jsxRuntime.jsx("div",{className:"mt-1 text-[10px] font-medium 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:"absolute inset-x-1 bottom-1 h-2 cursor-ns-resize rounded-full bg-border/90 transition-colors hover:bg-border"})]})}function me(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var fe={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 f=n.length;for(let p of a)i.push({...p,lane:d.get(p.id)??0,lanes:f});}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 f=o.get(c.id);i.set(c.id,f?{className:f}: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]),f=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:f,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,f=s.current;if(!f)return;let p=r.current;if(p.kind==="none"&&o.current){it({pointer:f,pendingDragRef:o,setDrag:a,setMovePreview:n,dragRef:r,suppressClickRef:d});return}if(p.kind==="none")return;if(p.kind==="move"){st(n,f);let l=at(p,f,t,c,i);l&&(d.current=true,r.current=l,a(l));return}let R=ct(p,f,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"}),[f,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,m)=>{let g=R.current[String(u)];if(!g)return 0;let y=m-g.getBoundingClientRect().top-12;return D(X(y/2),0,t)},[t]),V=h__namespace.useCallback((u,m)=>{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 m},[c]),E=h__namespace.useCallback((u,m,g,y)=>i.filter(k=>k.resourceId===m&&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 m=e.get(u.appointmentId);if(!m||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:m.raw,previous:{resourceId:m.resourceId,start:m.start,end:m.end},next:g});return}o&&await o({appointment:m.raw,resourceId:g.resourceId,start:g.start,end:g.end});},[e,r,E,s,o,a]),$=h__namespace.useCallback((u,m)=>{if(u.button!==0)return;u.stopPropagation(),l.current=false;let g=u.currentTarget.getBoundingClientRect(),y=M(m.resourceId,u.clientY);A.current={drag:{kind:"move",appointmentId:m.id,pointerId:u.pointerId,resourceId:m.resourceId,durationMin:Math.max(15,m.endMin-m.startMin),offsetMin:y-m.startMin,startMin:m.startMin,endMin:m.endMin},appointment:m,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,m)=>{u.button===0&&(u.stopPropagation(),l.current=false,A.current={drag:{kind:"resize",appointmentId:m.id,pointerId:u.pointerId,resourceId:m.resourceId,startMin:m.startMin,endMin:m.endMin},appointment:m,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:f,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 f=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=f.filter(M=>M.resourceId===r.resourceId);return I.set(r.resourceId,ce(T)),I},[p,r,f]),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={...fe,...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:f,laidOutByResource:R}}function we({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsxRuntime.jsx("div",{className:"rfs-times border-border 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 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 border-border bg-card",children:[jsxRuntime.jsx("div",{className:"rfs-gutter border-border",style:{width:72}}),e.map(r=>jsxRuntime.jsxs("div",{className:"rfs-resource-header border-border bg-card text-foreground",style:{minWidth:420,flex:1},children:[(t??(s=>Ne({resource:s})))(r),me(r)?jsxRuntime.jsx("div",{className:"rfs-resource-subtitle 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:f,drag:p,suppressClickRef:R})=>jsxRuntime.jsx("div",{className:"rfs-col border-border bg-card",style:{minWidth:420,flex:1},children:jsxRuntime.jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner bg-card",style:{height:r},children:[Array.from({length:Math.floor(s/60)+1}).map((l,b)=>jsxRuntime.jsx("div",{className:"rfs-hour-line 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 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=>f(T,l),appointmentAppearance:i,appointmentBackgroundColor:c,drag:p,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),_e=h__namespace.memo(Oe,mt);function H(...e){return e.filter(Boolean).join(" ")}var ft={default:"bg-primary text-primary-foreground hover:bg-primary/90",outline:"border border-border bg-card text-foreground hover:bg-muted",ghost:"text-foreground hover:bg-muted"},Rt={default:"h-9 px-4 py-2",sm:"h-8 px-3 text-xs",icon:"h-8 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("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",ft[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:"w-72 rounded-md bg-popover",children:[jsxRuntime.jsxs("div",{className:"mb-2 flex items-center 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:"text-sm 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:"grid grid-cols-7 gap-1 text-center text-xs text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(n=>jsxRuntime.jsx("div",{className:"py-1",children:n},n))}),jsxRuntime.jsx("div",{className:"grid grid-cols-7 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("text-xs",!dateFns.isSameMonth(n,r)&&"text-muted-foreground opacity-60",dateFns.isToday(n)&&!d&&"border 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 f=typeof d=="function"?d(a):d;t===void 0&&o(f),r?.(f);},[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);},f=p=>{p.key==="Escape"&&n(false);};return document.addEventListener("mousedown",d),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",d),document.removeEventListener("keydown",f);}},[a,n]),jsxRuntime.jsx(Ve.Provider,{value:{open:a,setOpen:n,triggerRef:i,contentRef:c},children:jsxRuntime.jsx("div",{className:"relative 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("absolute top-full z-50 mt-2 min-w-72 rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-md outline-none",r==="start"&&"left-0",r==="center"&&"left-1/2 -translate-x-1/2",r==="end"&&"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:"min-w-40 justify-start text-left font-normal",children:dateFns.format(e,"PPP")})}),jsxRuntime.jsx(Ge,{className:"w-auto 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:"flex items-center gap-2 rounded-lg border border-border bg-card p-1 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:f,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:m,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:f,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 rounded-lg bg-background 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 border-border 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:m,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:m,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'),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;
|
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??"bg-muted/40 dark:bg-muted/30",f=t?"border-red-500 bg-red-100/80 text-red-950 ring-1 ring-red-500/60 dark:bg-red-950/40 dark:text-red-100":"",p=e.visualState==="ghost"?"cursor-grab border-dashed opacity-35":e.visualState==="dragging"?"cursor-grabbing opacity-55 shadow-xl ring-1 ring-border/70":"cursor-grab",R=`relative h-full overflow-hidden rounded-md border border-border p-2 pb-5 text-foreground ${d} ${f} ${p}`;return jsxs("div",{onPointerDown:r,className:R,children:[t?jsx("div",{className:"absolute right-1 top-1 flex h-4 w-4 items-center justify-center rounded-full bg-red-600 text-[10px] font-bold text-white",children:"X"}):null,jsx("div",{className:"text-xs font-semibold",children:e.title}),a?jsx("div",{className:"mt-1 text-[10px] font-medium text-muted-foreground",children:a}):null,jsx("div",{role:"button","aria-label":"Resize appointment",onPointerDown:l=>{e.visualState!=="ghost"&&(l.stopPropagation(),s(l));},className:"absolute inset-x-1 bottom-1 h-2 cursor-ns-resize rounded-full bg-border/90 transition-colors hover:bg-border"})]})}function me(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.firstName=="string"||typeof t.lastName=="string"}var fe={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 f=n.length;for(let p of a)i.push({...p,lane:d.get(p.id)??0,lanes:f});}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 f=o.get(c.id);i.set(c.id,f?{className:f}: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]),f=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:f,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,f=s.current;if(!f)return;let p=r.current;if(p.kind==="none"&&o.current){it({pointer:f,pendingDragRef:o,setDrag:a,setMovePreview:n,dragRef:r,suppressClickRef:d});return}if(p.kind==="none")return;if(p.kind==="move"){st(n,f);let l=at(p,f,t,c,i);l&&(d.current=true,r.current=l,a(l));return}let R=ct(p,f,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"}),[f,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,m)=>{let g=R.current[String(u)];if(!g)return 0;let y=m-g.getBoundingClientRect().top-12;return D(X(y/2),0,t)},[t]),V=h.useCallback((u,m)=>{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 m},[c]),E=h.useCallback((u,m,g,y)=>i.filter(k=>k.resourceId===m&&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 m=e.get(u.appointmentId);if(!m||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:m.raw,previous:{resourceId:m.resourceId,start:m.start,end:m.end},next:g});return}o&&await o({appointment:m.raw,resourceId:g.resourceId,start:g.start,end:g.end});},[e,r,E,s,o,a]),$=h.useCallback((u,m)=>{if(u.button!==0)return;u.stopPropagation(),l.current=false;let g=u.currentTarget.getBoundingClientRect(),y=M(m.resourceId,u.clientY);A.current={drag:{kind:"move",appointmentId:m.id,pointerId:u.pointerId,resourceId:m.resourceId,durationMin:Math.max(15,m.endMin-m.startMin),offsetMin:y-m.startMin,startMin:m.startMin,endMin:m.endMin},appointment:m,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,m)=>{u.button===0&&(u.stopPropagation(),l.current=false,A.current={drag:{kind:"resize",appointmentId:m.id,pointerId:u.pointerId,resourceId:m.resourceId,startMin:m.startMin,endMin:m.endMin},appointment:m,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:f,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 f=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=f.filter(M=>M.resourceId===r.resourceId);return I.set(r.resourceId,ce(T)),I},[p,r,f]),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={...fe,...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:f,laidOutByResource:R}}function we({dayMinutes:e,dayStartAbs:t,gridHeight:r}){return jsx("div",{className:"rfs-times border-border 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 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 border-border bg-card",children:[jsx("div",{className:"rfs-gutter border-border",style:{width:72}}),e.map(r=>jsxs("div",{className:"rfs-resource-header border-border bg-card text-foreground",style:{minWidth:420,flex:1},children:[(t??(s=>Ne({resource:s})))(r),me(r)?jsx("div",{className:"rfs-resource-subtitle 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:f,drag:p,suppressClickRef:R})=>jsx("div",{className:"rfs-col border-border bg-card",style:{minWidth:420,flex:1},children:jsxs("div",{ref:l=>{t.current[String(e.id)]=l;},className:"rfs-col-inner bg-card",style:{height:r},children:[Array.from({length:Math.floor(s/60)+1}).map((l,b)=>jsx("div",{className:"rfs-hour-line 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 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=>f(T,l),appointmentAppearance:i,appointmentBackgroundColor:c,drag:p,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),_e=h.memo(Oe,mt);function H(...e){return e.filter(Boolean).join(" ")}var ft={default:"bg-primary text-primary-foreground hover:bg-primary/90",outline:"border border-border bg-card text-foreground hover:bg-muted",ghost:"text-foreground hover:bg-muted"},Rt={default:"h-9 px-4 py-2",sm:"h-8 px-3 text-xs",icon:"h-8 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("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",ft[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:"w-72 rounded-md bg-popover",children:[jsxs("div",{className:"mb-2 flex items-center justify-between",children:[jsx(P,{variant:"ghost",size:"icon","aria-label":"Previous month",onClick:()=>s(addMonths(r,-1)),children:"<"}),jsx("div",{className:"text-sm 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:"grid grid-cols-7 gap-1 text-center text-xs text-muted-foreground",children:["Mo","Tu","We","Th","Fr","Sa","Su"].map(n=>jsx("div",{className:"py-1",children:n},n))}),jsx("div",{className:"grid grid-cols-7 gap-1",children:a.map(n=>{let d=e?isSameDay(n,e):false;return jsx(P,{variant:d?"default":"ghost",size:"icon",className:H("text-xs",!isSameMonth(n,r)&&"text-muted-foreground opacity-60",isToday(n)&&!d&&"border 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 f=typeof d=="function"?d(a):d;t===void 0&&o(f),r?.(f);},[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);},f=p=>{p.key==="Escape"&&n(false);};return document.addEventListener("mousedown",d),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",d),document.removeEventListener("keydown",f);}},[a,n]),jsx(Ve.Provider,{value:{open:a,setOpen:n,triggerRef:i,contentRef:c},children:jsx("div",{className:"relative 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("absolute top-full z-50 mt-2 min-w-72 rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-md outline-none",r==="start"&&"left-0",r==="center"&&"left-1/2 -translate-x-1/2",r==="end"&&"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:"min-w-40 justify-start text-left font-normal",children:format(e,"PPP")})}),jsx(Ge,{className:"w-auto 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:"flex items-center gap-2 rounded-lg border border-border bg-card p-1 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:f,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:m,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:f,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 rounded-lg bg-background 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 border-border 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:m,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:m,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 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};
|
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)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-950:oklch(25.8% .092 26.042);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-950:oklch(27.4% .072 132.109);--color-green-100:oklch(96.2% .044 156.743);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-900:oklch(21% .034 264.665);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-900:oklch(21% .006 285.885);--color-neutral-100:oklch(97% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-stone-100:oklch(97% .001 106.424);--color-stone-900:oklch(21.6% .006 56.043);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:var(--tracking-normal);--leading-tight:1.25;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--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(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::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}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-x-1{inset-inline:calc(var(--spacing) * 1)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1{top:calc(var(--spacing) * 1)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.bottom-1{bottom:calc(var(--spacing) * 1)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-50{z-index:50}.mx-auto{margin-inline:auto}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-\[400px\]{min-width:400px}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-ns-resize{cursor:ns-resize}.resize{resize:both}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-border\/90{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/90{background-color:color-mix(in oklab, var(--border) 90%, transparent)}}.bg-card{background-color:var(--card)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-fuchsia-100{background-color:var(--color-fuchsia-100)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-lime-100{background-color:var(--color-lime-100)}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-100\/80{background-color:#ffe2e2cc}@supports (color:color-mix(in lab, red, red)){.bg-red-100\/80{background-color:color-mix(in oklab, var(--color-red-100) 80%, transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-300\/90{background-color:#cad5e2e6}@supports (color:color-mix(in lab, red, red)){.bg-slate-300\/90{background-color:color-mix(in oklab, var(--color-slate-300) 90%, transparent)}}.bg-stone-100{background-color:var(--color-stone-100)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-100{background-color:var(--color-zinc-100)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:calc(var(--tracking-normal) - .025em);letter-spacing:calc(var(--tracking-normal) - .025em)}.tracking-wide{--tw-tracking:calc(var(--tracking-normal) + .025em);letter-spacing:calc(var(--tracking-normal) + .025em)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-950{color:var(--color-red-950)}.text-slate-500{color:var(--color-slate-500)}.text-white{color:var(--color-white)}.opacity-35{opacity:.35}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.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)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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)}.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)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + 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)}.ring-border\/70{--tw-ring-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.ring-border\/70{--tw-ring-color:color-mix(in oklab, var(--border) 70%, transparent)}}.ring-red-500\/60{--tw-ring-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:bg-border:hover{background-color:var(--border)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}}.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)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.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)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width:64rem){.lg\:w-full{width:100%}}.dark\:bg-amber-950\/40:is(.dark *){background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-blue-950\/40:is(.dark *){background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-cyan-950\/40:is(.dark *){background-color:#05334566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-cyan-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-cyan-950) 40%, transparent)}}.dark\:bg-emerald-950\/40:is(.dark *){background-color:#002c2266}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-950) 40%, transparent)}}.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:#4b004f66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-fuchsia-950) 40%, transparent)}}.dark\:bg-gray-900\/40:is(.dark *){background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.dark\:bg-green-950\/40:is(.dark *){background-color:#032e1566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-green-950) 40%, transparent)}}.dark\:bg-indigo-950\/40:is(.dark *){background-color:#1e1a4d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-indigo-950) 40%, transparent)}}.dark\:bg-lime-950\/40:is(.dark *){background-color:#192e0366}@supports (color:color-mix(in lab, red, red)){.dark\:bg-lime-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-lime-950) 40%, transparent)}}.dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.dark\:bg-neutral-900\/40:is(.dark *){background-color:#17171766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-neutral-900) 40%, transparent)}}.dark\:bg-orange-950\/40:is(.dark *){background-color:#44130666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-orange-950) 40%, transparent)}}.dark\:bg-pink-950\/40:is(.dark *){background-color:#51042466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-pink-950) 40%, transparent)}}.dark\:bg-purple-950\/40:is(.dark *){background-color:#3c036666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-purple-950) 40%, transparent)}}.dark\:bg-red-950\/40:is(.dark *){background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-950\/40:is(.dark *){background-color:#4d021866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-rose-950) 40%, transparent)}}.dark\:bg-sky-950\/40:is(.dark *){background-color:#052f4a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-sky-950) 40%, transparent)}}.dark\:bg-slate-900\/40:is(.dark *){background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.dark\:bg-stone-900\/40:is(.dark *){background-color:#1c191766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-stone-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-stone-900) 40%, transparent)}}.dark\:bg-teal-950\/40:is(.dark *){background-color:#022f2e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-teal-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-teal-950) 40%, transparent)}}.dark\:bg-violet-950\/40:is(.dark *){background-color:#2f0d6866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-violet-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-violet-950) 40%, transparent)}}.dark\:bg-yellow-950\/40:is(.dark *){background-color:#43200466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-950) 40%, transparent)}}.dark\:bg-zinc-900\/40:is(.dark *){background-color:#18181b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 40%, transparent)}}.dark\:text-red-100:is(.dark *){color:var(--color-red-100)}}: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{--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(--text-sm);line-height:var(--tw-leading,var(--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-card-slot--ghost{z-index:10;pointer-events:none}.rfs-card-slot--dragging{z-index:30}.rfs-drag-overlay{z-index:60;pointer-events:none;position:fixed}.rfs-toolbar{margin-bottom:calc(var(--spacing) * 3);align-items:center;gap:calc(var(--spacing) * 2);display:flex}.rfs-btn{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--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(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-btn:hover{background:var(--rfs-bg)}.rfs-btn:disabled{cursor:not-allowed;opacity:.5}.rfs-date-label{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-shell{border-radius:var(--radius);border-style:var(--tw-border-style);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);overflow-x:auto}.rfs-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--rfs-border);display:flex}.rfs-gutter{left:calc(var(--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-resource-header{border-right-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);border-right-width:1px;border-color:var(--rfs-border)}.rfs-resource-subtitle{margin-top:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--rfs-muted)}.rfs-body{display:flex}.rfs-times{left:calc(var(--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-time-tick{left:calc(var(--spacing) * 1);color:var(--rfs-muted);font-size:11px;position:absolute}.rfs-grid{flex:1;display:flex}.rfs-col{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border)}.rfs-col-inner{position:relative}.rfs-hour-line,.rfs-slot-line{right:calc(var(--spacing) * 0);left:calc(var(--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-card-slot{padding:calc(var(--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-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
|
|
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}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marco.colia/react-fast-scheduler",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "A lightweight React scheduling library.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "npm run build:js && npm run build:css",
|
|
42
42
|
"build:js": "tsup",
|
|
43
|
-
"build:css": "tailwindcss -i ./src/global.css -o ./dist/styles.css --minify",
|
|
43
|
+
"build:css": "tailwindcss -i ./src/global.css -o ./dist/styles.css --minify && node ./scripts/scope-styles.mjs",
|
|
44
44
|
"dev:demo": "vite",
|
|
45
45
|
"changeset": "changeset",
|
|
46
46
|
"clean": "rimraf dist",
|
|
@@ -77,6 +77,8 @@
|
|
|
77
77
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
78
78
|
"globals": "^16.0.0",
|
|
79
79
|
"jsdom": "^26.1.0",
|
|
80
|
+
"postcss": "^8.5.8",
|
|
81
|
+
"postcss-prefix-selector": "^2.1.1",
|
|
80
82
|
"prettier": "^3.8.1",
|
|
81
83
|
"react": "^19.1.1",
|
|
82
84
|
"react-dom": "^19.1.1",
|