@marco.colia/react-fast-scheduler 1.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/constants.ts","../src/components/utils.ts","../src/components/Scheduler.tsx"],"names":["format","React","pointerMin","nextEndMin","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["const OPEN_TIME = '09:00';\nconst CLOSE_TIME = '18:00';\n\nconst STEP_MIN = 15;\nconst MIN_EVENT_MIN = 15;\nconst DEFAULT_CREATE_MIN = 30;\n\nconst PX_PER_MIN = 2; // visual scale\nconst HEADER_H = 56;\nconst GUTTER_W = 72;\nconst TOP_PAD = 12;\nconst BOTTOM_PAD = 24;\n\nconst RESOURCE_MIN_W = 420; // columns expand to fill available width; min width enables x-scroll when needed\nconst RESOURCE_MIN_W_TW = 'min-w-[400px] lg:w-full'; // columns expand to fill available width; min width enables x-scroll when needed\nconst LANE_GAP = 6;\n\nexport {\n OPEN_TIME,\n CLOSE_TIME,\n STEP_MIN,\n MIN_EVENT_MIN,\n DEFAULT_CREATE_MIN,\n PX_PER_MIN,\n HEADER_H,\n GUTTER_W,\n TOP_PAD,\n BOTTOM_PAD,\n RESOURCE_MIN_W,\n LANE_GAP,\n RESOURCE_MIN_W_TW,\n}","import { format } from \"date-fns\";\nimport { STEP_MIN } from \"./constants\";\n\ntype NameLike = {\n firstName?: string | null;\n lastName?: string | null;\n};\n\ntype TimeBlockLike<TId extends string | number = string | number> = {\n id: TId;\n startMin: number;\n endMin: number;\n};\n\ntype LaidOut<T extends TimeBlockLike> = T & {\n lane: number;\n lanes: number;\n};\n\nconst clamp = (n: number, min: number, max: number) => {\n return Math.max(min, Math.min(max, n));\n};\n\nconst snap = (mins: number, stepMin = STEP_MIN) => {\n return Math.round(mins / stepMin) * stepMin;\n};\n\nconst parseHHMM = (hhmm: string) => {\n const [h, m] = hhmm.split(\":\").map(Number);\n return h * 60 + m;\n};\n\nconst fullName = <T extends NameLike>(u: T) => {\n return `${u.firstName ?? \"\"} ${u.lastName ?? \"\"}`.trim();\n};\n\nconst dayISO = (d: Date) => {\n return format(d, \"yyyy-MM-dd\");\n};\n\nconst shiftDays = (d: Date, delta: number) => {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + delta);\n};\n\nconst dateAtMinute = (\n selectedDate: Date,\n dayStartAbs: number,\n minuteFromStart: number\n) => {\n const base = new Date(\n selectedDate.getFullYear(),\n selectedDate.getMonth(),\n selectedDate.getDate(),\n 0,\n 0,\n 0,\n 0\n );\n const abs = dayStartAbs + minuteFromStart;\n const hh = Math.floor(abs / 60);\n const mm = abs % 60;\n base.setHours(hh, mm, 0, 0);\n return base;\n};\n\nconst minutesFromDayStart = (dayStartAbs: number, dt: Date) => {\n return dt.getHours() * 60 + dt.getMinutes() - dayStartAbs;\n};\n\nconst overlaps = (a: TimeBlockLike, b: TimeBlockLike) => {\n return a.startMin < b.endMin && b.startMin < a.endMin;\n};\n\nconst layoutOverlaps = <T extends TimeBlockLike>(blocks: T[]): LaidOut<T>[] => {\n const sorted = [...blocks].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n\n const groups: T[][] = [];\n let active: T[] = [];\n let current: T[] = [];\n\n for (const e of sorted) {\n active = active.filter((x) => x.endMin > e.startMin);\n const conflicts = active.some((x) => overlaps(x, e));\n\n if (!conflicts && current.length > 0) {\n groups.push(current);\n current = [];\n }\n current.push(e);\n active.push(e);\n }\n if (current.length) {\n groups.push(current);\n }\n\n const out: LaidOut<T>[] = [];\n\n for (const group of groups) {\n const g = [...group].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n const laneEnd: number[] = [];\n const laneOf = new Map<T[\"id\"], number>();\n\n for (const e of g) {\n let placed = false;\n for (let i = 0; i < laneEnd.length; i++) {\n if (laneEnd[i] <= e.startMin) {\n laneEnd[i] = e.endMin;\n laneOf.set(e.id, i);\n placed = true;\n break;\n }\n }\n if (!placed) {\n laneEnd.push(e.endMin);\n laneOf.set(e.id, laneEnd.length - 1);\n }\n }\n\n const lanes = laneEnd.length;\n for (const e of g) {\n out.push({ ...e, lane: laneOf.get(e.id) ?? 0, lanes });\n }\n }\n\n return out;\n};\n\nexport {\n clamp,\n snap,\n parseHHMM,\n fullName,\n dayISO,\n shiftDays,\n dateAtMinute,\n minutesFromDayStart,\n overlaps,\n layoutOverlaps,\n};\n","import * as React from \"react\";\nimport { BOTTOM_PAD, GUTTER_W, MIN_EVENT_MIN, PX_PER_MIN, RESOURCE_MIN_W, STEP_MIN, TOP_PAD } from \"./constants\";\nimport { clamp, dateAtMinute, dayISO, fullName, layoutOverlaps, minutesFromDayStart, overlaps, parseHHMM, shiftDays, snap } from \"./utils\";\nimport type { BaseSchedulerResource, SchedulerDragState, SchedulerEvent, SchedulerId, SchedulerProps } from \"../types/scheduler\";\n\nfunction isNameLike(resource: unknown): resource is { firstName?: string | null; lastName?: string | null } {\n if (!resource || typeof resource !== \"object\") {\n return false;\n }\n const maybe = resource as { firstName?: unknown; lastName?: unknown };\n return typeof maybe.firstName === \"string\" || typeof maybe.lastName === \"string\";\n}\n\nexport function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({\n resources,\n appointments,\n selectedDate,\n onSelectedDateChange,\n adapter,\n onPersistMoveResize,\n onAppointmentChange,\n renderResourceHeader,\n renderAppointment,\n getResourceAppointmentBackground,\n renderDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\",\n dayStart = \"09:00\",\n dayEnd = \"18:00\"\n}: SchedulerProps<TAppointment, TResource, TResourceId>) {\n const [drag, setDrag] = React.useState<SchedulerDragState<TResourceId>>({ kind: \"none\" });\n const colRefs = React.useRef<Record<string, HTMLDivElement | null>>({});\n const suppressClickRef = React.useRef(false);\n\n const dayStartAbs = parseHHMM(dayStart);\n const dayEndAbs = parseHHMM(dayEnd);\n const dayMinutes = Math.max(0, dayEndAbs - dayStartAbs);\n const gridHeight = TOP_PAD + dayMinutes * PX_PER_MIN + BOTTOM_PAD;\n const gridMinWidth = GUTTER_W + Math.max(resources.length, 1) * RESOURCE_MIN_W;\n const selectedISO = React.useMemo(() => dayISO(selectedDate), [selectedDate]);\n\n const renderAppts = React.useMemo<SchedulerEvent<TAppointment, TResourceId>[]>(() => {\n return appointments\n .map((appointment) => {\n const start = new Date(adapter.getStart(appointment));\n const end = new Date(adapter.getEnd(appointment));\n return {\n raw: appointment,\n id: adapter.getId(appointment),\n resourceId: adapter.getResourceId(appointment),\n start,\n end,\n startMin: clamp(minutesFromDayStart(dayStartAbs, start), 0, dayMinutes),\n endMin: clamp(minutesFromDayStart(dayStartAbs, end), 0, dayMinutes),\n title: adapter.getTitle(appointment)\n };\n })\n .filter((appointment) => dayISO(appointment.start) === selectedISO);\n }, [appointments, adapter, dayStartAbs, dayMinutes, selectedISO]);\n\n const appointmentMap = React.useMemo(() => {\n return new Map(renderAppts.map((appointment) => [appointment.id, appointment]));\n }, [renderAppts]);\n\n const effectiveAppts = React.useMemo<SchedulerEvent<TAppointment, TResourceId>[]>(() => {\n if (drag.kind === \"none\") {\n return renderAppts;\n }\n return renderAppts.map((appointment) => {\n if (appointment.id !== drag.appointmentId) {\n return appointment;\n }\n return {\n ...appointment,\n resourceId: drag.resourceId,\n startMin: drag.startMin,\n endMin: drag.endMin,\n start: dateAtMinute(selectedDate, dayStartAbs, drag.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, drag.endMin)\n };\n });\n }, [drag, renderAppts, selectedDate, dayStartAbs]);\n\n const laidOutByResource = React.useMemo(() => {\n const byResource = new Map<TResourceId, ReturnType<typeof layoutOverlaps<SchedulerEvent<TAppointment, TResourceId>>>>();\n for (const resource of resources) {\n const events = effectiveAppts.filter((appointment) => appointment.resourceId === resource.id);\n byResource.set(resource.id, layoutOverlaps(events));\n }\n return byResource;\n }, [effectiveAppts, resources]);\n\n const appointmentBgByResource = React.useMemo(() => {\n const map = new Map<TResourceId, string | undefined>();\n if (!getResourceAppointmentBackground) {\n return map;\n }\n for (const resource of resources) {\n map.set(resource.id, getResourceAppointmentBackground(resource));\n }\n return map;\n }, [getResourceAppointmentBackground, resources]);\n\n const pointerToMin = (resourceId: TResourceId, clientY: number) => {\n const col = colRefs.current[String(resourceId)];\n if (!col) {\n return 0;\n }\n const y = clientY - col.getBoundingClientRect().top - TOP_PAD;\n return clamp(snap(y / PX_PER_MIN), 0, dayMinutes);\n };\n\n const pointerToResourceId = (clientX: number, fallbackResourceId: TResourceId) => {\n for (const resource of resources) {\n const col = colRefs.current[String(resource.id)];\n if (!col) {\n continue;\n }\n const rect = col.getBoundingClientRect();\n if (clientX >= rect.left && clientX <= rect.right) {\n return resource.id;\n }\n }\n return fallbackResourceId;\n };\n\n const hasOverlap = (appointmentId: SchedulerId, resourceId: TResourceId, startMin: number, endMin: number) => {\n const events = renderAppts.filter((appointment) => appointment.resourceId === resourceId && appointment.id !== appointmentId);\n return events.some((appointment) => overlaps(appointment, { id: appointmentId, startMin, endMin }));\n };\n\n const persistDrag = async (state: Exclude<SchedulerDragState<TResourceId>, { kind: \"none\" }>) => {\n const target = appointmentMap.get(state.appointmentId);\n if (!target) {\n return;\n }\n if (hasOverlap(state.appointmentId, state.resourceId, state.startMin, state.endMin)) {\n return;\n }\n const next = {\n resourceId: state.resourceId,\n start: dateAtMinute(selectedDate, dayStartAbs, state.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, state.endMin)\n };\n\n if (onAppointmentChange) {\n await onAppointmentChange({\n kind: state.kind,\n appointment: target.raw,\n previous: {\n resourceId: target.resourceId,\n start: target.start,\n end: target.end\n },\n next\n });\n return;\n }\n\n if (onPersistMoveResize) {\n await onPersistMoveResize({\n appointment: target.raw,\n resourceId: next.resourceId,\n start: next.start,\n end: next.end\n });\n }\n };\n\n const onApptPointerDown = (event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n suppressClickRef.current = false;\n const pointerMin = pointerToMin(appointment.resourceId, event.clientY);\n setDrag({\n kind: \"move\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n durationMin: Math.max(MIN_EVENT_MIN, appointment.endMin - appointment.startMin),\n offsetMin: pointerMin - appointment.startMin,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n };\n\n const onResizePointerDown = (event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n suppressClickRef.current = false;\n setDrag({\n kind: \"resize\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n };\n\n const onGlobalPointerMove = (event: React.PointerEvent<HTMLElement>) => {\n if (drag.kind === \"none\") {\n return;\n }\n\n if (drag.kind === \"move\") {\n const nextResourceId = pointerToResourceId(event.clientX, drag.resourceId);\n const pointerMin = pointerToMin(nextResourceId, event.clientY);\n const rawStart = pointerMin - drag.offsetMin;\n const nextStartMin = clamp(snap(rawStart), 0, dayMinutes - drag.durationMin);\n const nextEndMin = nextStartMin + drag.durationMin;\n if (nextStartMin !== drag.startMin || nextEndMin !== drag.endMin || nextResourceId !== drag.resourceId) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n resourceId: nextResourceId,\n startMin: nextStartMin,\n endMin: nextEndMin\n });\n }\n return;\n }\n\n const pointerMin = pointerToMin(drag.resourceId, event.clientY);\n const nextEndMin = clamp(snap(pointerMin), drag.startMin + MIN_EVENT_MIN, dayMinutes);\n if (nextEndMin !== drag.endMin) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n endMin: nextEndMin\n });\n }\n };\n\n const onGlobalPointerUp = () => {\n if (drag.kind === \"none\") {\n return;\n }\n const current = drag;\n setDrag({ kind: \"none\" });\n if (suppressClickRef.current) {\n void persistDrag(current);\n }\n };\n\n return (\n <section\n className={`rfs-root ${drag.kind === \"move\" ? \"rfs-root--drag-move\" : \"\"} ${drag.kind === \"resize\" ? \"rfs-root--drag-resize\" : \"\"}`}\n onPointerMove={onGlobalPointerMove}\n onPointerUp={onGlobalPointerUp}\n onPointerCancel={onGlobalPointerUp}\n >\n <div className=\"rfs-toolbar\">\n <button className=\"rfs-btn\" type=\"button\" onClick={() => onSelectedDateChange(shiftDays(selectedDate, -1))}>\n {prevButtonLabel}\n </button>\n {renderDatePicker ? (\n renderDatePicker({ selectedDate, onSelectedDateChange })\n ) : (\n <strong className=\"rfs-date-label\">{selectedISO}</strong>\n )}\n <button className=\"rfs-btn\" type=\"button\" onClick={() => onSelectedDateChange(shiftDays(selectedDate, 1))}>\n {nextButtonLabel}\n </button>\n </div>\n\n <div className=\"rfs-shell\">\n <div style={{ minWidth: gridMinWidth }}>\n <div className=\"rfs-header\">\n <div className=\"rfs-gutter\" style={{ width: GUTTER_W }} />\n {resources.map((resource) => (\n <div key={String(resource.id)} className=\"rfs-resource-header\" style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}>\n {renderResourceHeader(resource)}\n {isNameLike(resource) ? <div className=\"rfs-resource-subtitle\">{fullName(resource)}</div> : null}\n </div>\n ))}\n </div>\n <div className=\"rfs-body\">\n <div className=\"rfs-times\" style={{ width: GUTTER_W, height: gridHeight }}>\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div key={`tick-${i}`} className=\"rfs-time-tick\" style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}>\n {String(Math.floor((dayStartAbs + i * 60) / 60)).padStart(2, \"0\")}:\n {String((dayStartAbs + i * 60) % 60).padStart(2, \"0\")}\n </div>\n ))}\n </div>\n <div className=\"rfs-grid\">\n {resources.map((resource) => (\n <div key={String(resource.id)} className=\"rfs-col\" style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}>\n <div\n ref={(el) => {\n colRefs.current[String(resource.id)] = el;\n }}\n className=\"rfs-col-inner\"\n style={{ height: gridHeight }}\n >\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div\n key={`major-${String(resource.id)}-${i}`}\n className=\"rfs-hour-line\"\n style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}\n />\n ))}\n {Array.from({ length: Math.floor(dayMinutes / STEP_MIN) + 1 }).map((_, i) => (\n <div\n key={`minor-${String(resource.id)}-${i}`}\n className=\"rfs-slot-line\"\n style={{ top: TOP_PAD + i * STEP_MIN * PX_PER_MIN }}\n />\n ))}\n {(laidOutByResource.get(resource.id) ?? []).map((appointment) => {\n const laneWidthPct = 100 / appointment.lanes;\n const top = TOP_PAD + appointment.startMin * PX_PER_MIN;\n const height = Math.max(MIN_EVENT_MIN * PX_PER_MIN, (appointment.endMin - appointment.startMin) * PX_PER_MIN);\n const appointmentBackgroundColor = appointmentBgByResource.get(resource.id);\n return (\n <div\n key={String(appointment.id)}\n className=\"rfs-card-slot\"\n style={{\n top,\n left: `${laneWidthPct * appointment.lane}%`,\n width: `${laneWidthPct}%`,\n height\n }}\n >\n {renderAppointment({\n appointment,\n onPointerDown: (event) => onApptPointerDown(event, appointment),\n onResizePointerDown: (event) => onResizePointerDown(event, appointment),\n appointmentBackgroundColor,\n drag,\n suppressClickRef\n })}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/defaultRenderAppointment/index.tsx","../src/components/constants.ts","../src/utils/scheduler-core.utils.ts","../src/components/defaultRenderDatePicker/index.tsx","../src/components/defaultRenderResourceHeader/index.tsx","../src/utils/scheduler-data.utils.ts","../src/hooks/useSchedulerBaseData.ts","../src/hooks/useSchedulerInteractions.ts","../src/hooks/useSchedulerPresentationData.ts","../src/components/scheduler/index.tsx","../src/utils/scheduler-appointment-change.utils.ts"],"names":["jsxs","jsx","format","React","React2","pointerMin","nextEndMin","React3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,wBAAA,CAAwE;AAAA,EACtF,WAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,EAA6D;AAC3D,EAAA,MAAM,WAAW,WAAA,CAAY,GAAA;AAC7B,EAAA,MAAM,cAAc,OAAO,QAAA,CAAS,WAAA,KAAgB,QAAA,GAAW,SAAS,WAAA,GAAc,MAAA;AACtF,EAAA,MAAM,eAAA,GAAkB,OAAO,0BAAA,KAA+B,QAAA,GAAW,0BAAA,GAA6B,MAAA;AACtG,EAAA,MAAM,mBAAA,GAAsB,qBAAA,EAAuB,SAAA,IAAa,eAAA,IAAmB,8BAAA;AACnF,EAAA,MAAM,SAAA,GAAY,wGAAwG,mBAAmB,CAAA,CAAA;AAE7I,EAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAA8B,SAAA,EACjC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,WAAA,CAAY,KAAA,EAAM,CAAA;AAAA,IACzD,8BAAcA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAsD,uBAAY,CAAA,GAAS,IAAA;AAAA,oBACzGA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,oBAAA;AAAA,QACX,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,QAC3B,CAAA;AAAA,QACA,SAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;;;AC7BA,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,aAAA,GAAgB,EAAA;AAGtB,IAAM,UAAA,GAAa,CAAA;AAEnB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,UAAA,GAAa,EAAA;AAEnB,IAAM,cAAA,GAAiB,GAAA;;;ACRhB,SAAS,WAAW,QAAA,EAAyC;AAClE,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA;AACd,EAAA,OAAO,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAAY,OAAO,MAAM,QAAA,KAAa,QAAA;AAC1E;AAEO,SAAS,iBAAiB,IAAA,EAAoB;AACnD,EAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC;AAEO,SAAS,mBAAmB,KAAA,EAA4B;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,OAAO,OAAO,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,EAAG;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AACtC;AAEO,IAAM,yCAAA,GAA4F;AAAA,EACvG,KAAA,EAAO,mCAAA;AAAA,EACP,IAAA,EAAM,iCAAA;AAAA,EACN,IAAA,EAAM,iCAAA;AAAA,EACN,OAAA,EAAS,uCAAA;AAAA,EACT,KAAA,EAAO,mCAAA;AAAA,EACP,GAAA,EAAK,+BAAA;AAAA,EACL,MAAA,EAAQ,qCAAA;AAAA,EACR,KAAA,EAAO,mCAAA;AAAA,EACP,MAAA,EAAQ,qCAAA;AAAA,EACR,IAAA,EAAM,iCAAA;AAAA,EACN,KAAA,EAAO,mCAAA;AAAA,EACP,OAAA,EAAS,uCAAA;AAAA,EACT,IAAA,EAAM,iCAAA;AAAA,EACN,IAAA,EAAM,iCAAA;AAAA,EACN,GAAA,EAAK,+BAAA;AAAA,EACL,IAAA,EAAM,iCAAA;AAAA,EACN,MAAA,EAAQ,qCAAA;AAAA,EACR,MAAA,EAAQ,qCAAA;AAAA,EACR,MAAA,EAAQ,qCAAA;AAAA,EACR,OAAA,EAAS,uCAAA;AAAA,EACT,IAAA,EAAM,iCAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAa;AACzD,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;AAEO,SAAS,IAAA,CAAK,IAAA,EAAc,OAAA,GAAU,QAAA,EAAU;AACrD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,OAAO,CAAA,GAAI,OAAA;AACtC;AAEO,SAAS,UAAU,IAAA,EAAc;AACtC,EAAA,MAAM,CAAC,GAAG,CAAC,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzC,EAAA,OAAO,IAAI,EAAA,GAAK,CAAA;AAClB;AAEO,SAAS,SAA6B,QAAA,EAAa;AACxD,EAAA,OAAO,CAAA,EAAG,SAAS,SAAA,IAAa,EAAE,IAAI,QAAA,CAAS,QAAA,IAAY,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK;AACvE;AAEO,SAAS,OAAO,IAAA,EAAY;AACjC,EAAA,OAAOC,cAAA,CAAO,MAAM,YAAY,CAAA;AAClC;AAEO,SAAS,SAAA,CAAU,MAAY,KAAA,EAAe;AACnD,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,IAAA,CAAK,OAAA,EAAQ,GAAI,KAAK,CAAA;AAC7E;AAEO,SAAS,YAAA,CAAa,YAAA,EAAoB,WAAA,EAAqB,eAAA,EAAyB;AAC7F,EAAA,MAAM,OAAO,IAAI,IAAA;AAAA,IACf,aAAa,WAAA,EAAY;AAAA,IACzB,aAAa,QAAA,EAAS;AAAA,IACtB,aAAa,OAAA,EAAQ;AAAA,IACrB,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,MAAM,WAAA,GAAc,eAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,EAAE,CAAA;AAC9B,EAAA,MAAM,KAAK,GAAA,GAAM,EAAA;AACjB,EAAA,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAC1B,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,aAAqB,IAAA,EAAY;AACnE,EAAA,OAAO,KAAK,QAAA,EAAS,GAAI,EAAA,GAAK,IAAA,CAAK,YAAW,GAAI,WAAA;AACpD;AAEO,SAAS,QAAA,CAAS,GAAkB,CAAA,EAAkB;AAC3D,EAAA,OAAO,EAAE,QAAA,GAAW,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA;AACjD;AAEO,SAAS,eAAwC,MAAA,EAA2B;AACjF,EAAA,MAAM,SAAS,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AACxF,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,IAAI,SAAc,EAAC;AACnB,EAAA,IAAI,UAAe,EAAC;AAEpB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,MAAA,GAAS,MAAM,QAAQ,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,CAAC,SAAS,QAAA,CAAS,IAAA,EAAM,KAAK,CAAC,CAAA;AAE7D,IAAA,IAAI,CAAC,SAAA,IAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACpC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AACA,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,SAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,cAAc,CAAC,GAAG,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAC5F,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAqB;AAExC,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,IAAK,KAAA,CAAM,QAAA,EAAU;AAChC,UAAA,OAAA,CAAQ,CAAC,IAAI,KAAA,CAAM,MAAA;AACnB,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA;AACtB,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,MAAM,CAAA;AACzB,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA,EAAG,KAAA,EAAO,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC1JO,SAAS,uBAAA,CAAwB,EAAE,YAAA,EAAc,oBAAA,EAAqB,EAAiC;AAC5G,EAAA,uBACED,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,iBAAiB,YAAY,CAAA;AAAA,MACpC,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AACtD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,oBAAA,CAAqB,QAAQ,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAU,0EAAA;AAAA,MACV,YAAA,EAAW;AAAA;AAAA,GACb;AAEJ;ACfO,SAAS,2BAAA,CAGd,EAAE,QAAA,EAAS,EAA6D;AACxE,EAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,QAAA,CAAS,KAAA,EAAM,CAAA;AACjC;;;ACWO,SAAS,gBAAA,CAAqE;AAAA,EACnF,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4D;AAC1D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAqC;AACrD,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,GAAA,CAAI,IAAI,KAAA,CAAM,QAAQ,GAAG,QAAA,CAAS,QAAQ,KAAK,QAAQ,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,qBAAA,CAAqE;AAAA,EACnF,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAyD;AACvD,EAAA,OAAO,YAAA,CACJ,GAAA,CAAI,CAAC,WAAA,KAAgB;AACpB,IAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAC,CAAA;AACpD,IAAA,MAAM,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAC,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,EAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAAA,MAC7B,UAAA,EAAY,OAAA,CAAQ,aAAA,CAAc,WAAW,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAU,KAAA,CAAM,mBAAA,CAAoB,aAAa,KAAK,CAAA,EAAG,GAAG,UAAU,CAAA;AAAA,MACtE,QAAQ,KAAA,CAAM,mBAAA,CAAoB,aAAa,GAAG,CAAA,EAAG,GAAG,UAAU,CAAA;AAAA,MAClE,KAAA,EAAO,OAAA,CAAQ,QAAA,CAAS,WAAW;AAAA,KACrC;AAAA,EACF,CAAC,EACA,MAAA,CAAO,CAAC,gBAAgB,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA,KAAM,WAAW,CAAA;AACtE;AAEO,SAAS,oBAAmE,YAAA,EAA2D;AAC5I,EAAA,OAAO,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,KAAgB,CAAC,WAAA,CAAY,EAAA,EAAI,WAAW,CAAC,CAAC,CAAA;AACjF;AAEO,SAAS,uBAAA,CACd,YAAA,EACA,IAAA,EACA,YAAA,EACA,WAAA,EACA;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,KAAgB;AACvC,IAAA,IAAI,WAAA,CAAY,EAAA,KAAO,IAAA,CAAK,aAAA,EAAe;AACzC,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,WAAA;AAAA,MACH,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA,EAAO,YAAA,CAAa,YAAA,EAAc,WAAA,EAAa,KAAK,QAAQ,CAAA;AAAA,MAC5D,GAAA,EAAK,YAAA,CAAa,YAAA,EAAc,WAAA,EAAa,KAAK,MAAM;AAAA,KAC1D;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,sBAAA,CAId,WAAwB,YAAA,EAA2D;AACnF,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAA8D;AAEjG,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,UAAU,sBAAA,CAAuB,GAAA,CAAI,WAAA,CAAY,UAAU,KAAK,EAAC;AACvE,IAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,IAAA,sBAAA,CAAuB,GAAA,CAAI,WAAA,CAAY,UAAA,EAAY,OAAO,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0E;AAC7F,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,cAAA,CAAe,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,EAAE,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,oCAAA,CAId,SAAA,EACA,2BAAA,EACA,gCAAA,EACA,sCACA,uBAAA,EACA;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA6D;AAE7E,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,cAAA,GAAiB,2BAAA,GAA8B,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA;AACxE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,GAAA,CAAI,IAAI,QAAA,CAAS,EAAA,EAAI,EAAE,SAAA,EAAW,gBAAgB,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,mCAAmC,QAAQ,CAAA;AAC9D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,UAAU,CAAA;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,oCAAA,CAAqC,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AACvE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,GAAA,CAAI,IAAI,QAAA,CAAS,EAAA,EAAI,EAAE,SAAA,EAAW,YAAY,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,uBAAA,CAAwB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAChE,IAAA,GAAA,CAAI,GAAA,CAAI,SAAS,EAAA,EAAI,gBAAA,GAAmB,EAAE,SAAA,EAAW,gBAAA,KAAqB,MAAS,CAAA;AAAA,EACrF;AAEA,EAAA,OAAO,GAAA;AACT;;;ACzIO,SAAS,oBAAA,CAId;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,QAAA,GAAW,OAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAiH;AAC/G,EAAA,MAAM,WAAA,GAAoBE,0BAAQ,MAAM,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACvE,EAAA,MAAM,SAAA,GAAkBA,0BAAQ,MAAM,SAAA,CAAU,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,UAAA,GAAmBA,iBAAA,CAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,WAAW,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AACrG,EAAA,MAAM,UAAA,GAAmBA,0BAAQ,MAAM,OAAA,GAAU,aAAa,UAAA,GAAa,UAAA,EAAY,CAAC,UAAU,CAAC,CAAA;AACnG,EAAA,MAAM,YAAA,GAAqBA,iBAAA,CAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAC,CAAA,GAAI,cAAA,EAAgB,CAAC,SAAA,CAAU,MAAM,CAAC,CAAA;AACtH,EAAA,MAAM,WAAA,GAAoBA,0BAAQ,MAAM,MAAA,CAAO,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAE5E,EAAA,MAAM,WAAA,GAAoBA,0BAAQ,MAAM;AACtC,IAAA,OAAO,qBAAA,CAAsB;AAAA,MAC3B,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,cAAc,UAAA,EAAY,WAAA,EAAa,WAAW,CAAC,CAAA;AAEhE,EAAA,MAAM,cAAA,GAAuBA,0BAAQ,MAAM,mBAAA,CAAoB,WAAW,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAE1F,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;ACzCO,SAAS,wBAAA,CAId;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAyH;AACvH,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAUC,2BAA0C,EAAE,IAAA,EAAM,QAAQ,CAAA;AACxF,EAAA,MAAM,OAAA,GAAgBA,iBAAA,CAAA,MAAA,CAA8C,EAAE,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAyBA,yBAAO,KAAK,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAqBA,iBAAA,CAAA,WAAA;AAAA,IACzB,CAAC,YAAyB,OAAA,KAAoB;AAC5C,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAC,CAAA;AAC9C,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,CAAA,GAAI,OAAA,GAAU,GAAA,CAAI,qBAAA,GAAwB,GAAA,GAAM,OAAA;AACtD,MAAA,OAAO,MAAM,IAAA,CAAK,CAAA,GAAI,UAAU,CAAA,EAAG,GAAG,UAAU,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,mBAAA,GAA4BA,iBAAA,CAAA,WAAA;AAAA,IAChC,CAAC,SAAiB,kBAAA,KAAoC;AACpD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA;AAC/C,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,QAAA,IAAI,OAAA,IAAW,IAAA,CAAK,IAAA,IAAQ,OAAA,IAAW,KAAK,KAAA,EAAO;AACjD,UAAA,OAAO,QAAA,CAAS,EAAA;AAAA,QAClB;AAAA,MACF;AAEA,MAAA,OAAO,kBAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,UAAA,GAAmBA,iBAAA,CAAA,WAAA;AAAA,IACvB,CAAC,aAAA,EAA4B,UAAA,EAAyB,QAAA,EAAkB,MAAA,KAAmB;AACzF,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,CAAC,WAAA,KAAgB,YAAY,UAAA,KAAe,UAAA,IAAc,WAAA,CAAY,EAAA,KAAO,aAAa,CAAA;AAC5H,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,WAAA,KAAgB,QAAA,CAAS,WAAA,EAAa,EAAqB,QAAA,EAAU,MAAA,EAAQ,CAAC,CAAA;AAAA,IACpG,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,WAAA,GAAoBA,iBAAA,CAAA,WAAA;AAAA,IACxB,OAAO,KAAA,KAAsE;AAC3E,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA;AACrD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,MAAM,aAAA,EAAe,KAAA,CAAM,YAAY,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA,EAAG;AACnF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,KAAA,EAAO,YAAA,CAAa,YAAA,EAAc,WAAA,EAAa,MAAM,QAAQ,CAAA;AAAA,QAC7D,GAAA,EAAK,YAAA,CAAa,YAAA,EAAc,WAAA,EAAa,MAAM,MAAM;AAAA,OAC3D;AAEA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,MAAM,mBAAA,CAAoB;AAAA,UACxB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,aAAa,MAAA,CAAO,GAAA;AAAA,UACpB,QAAA,EAAU;AAAA,YACR,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,KAAK,MAAA,CAAO;AAAA,WACd;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,MAAM,mBAAA,CAAoB;AAAA,UACxB,aAAa,MAAA,CAAO,GAAA;AAAA,UACpB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAK,IAAA,CAAK;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,WAAA,EAAa,UAAA,EAAY,mBAAA,EAAqB,qBAAqB,YAAY;AAAA,GAClG;AAEA,EAAA,MAAM,iBAAA,GAA0BA,iBAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,OAA2B,WAAA,KAA2D;AACrF,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,WAAA,CAAY,UAAA,EAAY,MAAM,OAAO,CAAA;AACrE,MAAA,OAAA,CAAQ;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,eAAe,WAAA,CAAY,EAAA;AAAA,QAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,aAAa,IAAA,CAAK,GAAA,CAAI,eAAe,WAAA,CAAY,MAAA,GAAS,YAAY,QAAQ,CAAA;AAAA,QAC9E,SAAA,EAAW,aAAa,WAAA,CAAY,QAAA;AAAA,QACpC,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,mBAAA,GAA4BA,iBAAA,CAAA,WAAA,CAAY,CAAC,KAAA,EAA2B,WAAA,KAA2D;AACnI,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,IAAA,OAAA,CAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,eAAe,WAAA,CAAY,EAAA;AAAA,MAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,YAAY,WAAA,CAAY,UAAA;AAAA,MACxB,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,QAAQ,WAAA,CAAY;AAAA,KACrB,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAA4BA,iBAAA,CAAA,WAAA;AAAA,IAChC,CAAC,KAAA,KAA2C;AAC1C,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,QAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,KAAA,CAAM,OAAA,EAAS,KAAK,UAAU,CAAA;AACzE,QAAA,MAAMC,WAAAA,GAAa,YAAA,CAAa,cAAA,EAAgB,KAAA,CAAM,OAAO,CAAA;AAC7D,QAAA,MAAM,QAAA,GAAWA,cAAa,IAAA,CAAK,SAAA;AACnC,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,QAAQ,GAAG,CAAA,EAAG,UAAA,GAAa,KAAK,WAAW,CAAA;AAC3E,QAAA,MAAMC,WAAAA,GAAa,eAAe,IAAA,CAAK,WAAA;AAEvC,QAAA,IAAI,YAAA,KAAiB,KAAK,QAAA,IAAYA,WAAAA,KAAe,KAAK,MAAA,IAAU,cAAA,KAAmB,KAAK,UAAA,EAAY;AACtG,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,UAAA,OAAA,CAAQ;AAAA,YACN,GAAG,IAAA;AAAA,YACH,UAAA,EAAY,cAAA;AAAA,YACZ,QAAA,EAAU,YAAA;AAAA,YACV,MAAA,EAAQA;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM,OAAO,CAAA;AAC9D,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAU,GAAG,IAAA,CAAK,QAAA,GAAW,eAAe,UAAU,CAAA;AACpF,MAAA,IAAI,UAAA,KAAe,KAAK,MAAA,EAAQ;AAC9B,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,QAAA,OAAA,CAAQ;AAAA,UACN,GAAG,IAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,mBAAmB;AAAA,GACtD;AAEA,EAAA,MAAM,iBAAA,GAA0BF,8BAAY,MAAM;AAChD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AACxB,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,KAAK,YAAY,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF;ACnMO,SAAS,4BAAA,CAId;AAAA,EACA,6BAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,gCAAA;AAAA,EACA,gCAAA;AAAA,EACA,gCAAA;AAAA,EACA,WAAA;AAAA,EACA,2BAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiI;AAC/H,EAAA,MAAM,cAAA,GAAuBG,0BAAQ,MAAM;AACzC,IAAA,OAAO,uBAAA,CAAwB,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAAA,EAC7E,GAAG,CAAC,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,YAAY,CAAC,CAAA;AAEjD,EAAA,MAAM,iBAAA,GAA0BA,0BAAQ,MAAM;AAC5C,IAAA,OAAO,sBAAA,CAAuB,WAAW,cAAc,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE9B,EAAA,MAAM,uBAAA,GAAgCA,0BAAQ,MAAM;AAClD,IAAA,IAAI,CAAC,gCAAA,EAAkC;AACrC,MAAA,2BAAW,GAAA,EAAqC;AAAA,IAClD;AAEA,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,gCAAA;AAAA,MACV,SAAA;AAAA,MACA,KAAA,EAAO,CAAC,QAAA,KAAa,QAAA,CAAS;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,gCAAA,EAAkC,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,oCAAA,GAA6CA,0BAAQ,MAAM;AAC/D,IAAA,IAAI,CAAC,gCAAA,EAAkC;AACrC,MAAA,2BAAW,GAAA,EAAqC;AAAA,IAClD;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,yCAAA;AAAA,MACH,GAAI,iCAAiC;AAAC,KACxC;AAEA,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,CAAC,QAAA,KAAwB;AACjC,QAAA,MAAM,KAAA,GAAQ,iCAAiC,QAAQ,CAAA;AACvD,QAAA,OAAO,KAAA,GAAQ,cAAA,CAAe,KAAK,CAAA,GAAI,MAAA;AAAA,MACzC,CAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,CAAC,QAAA,KAAa,QAAA,CAAS;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,6BAAA,EAA+B,gCAAA,EAAkC,SAAS,CAAC,CAAA;AAE/E,EAAA,MAAM,+BAAA,GAAwCA,0BAAQ,MAAM;AAC1D,IAAA,OAAO,oCAAA;AAAA,MACL,SAAA;AAAA,MACA,2BAAA;AAAA,MACA,gCAAA;AAAA,MACA,oCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,uBAAA;AAAA,IACA,oCAAA;AAAA,IACA,gCAAA;AAAA,IACA,2BAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,+BAAA;AAAA,IACA,uBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AChFO,SAAS,SAAA,CAA+G;AAAA,EAC7H,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,2BAAA;AAAA,EACA,gCAAA;AAAA,EACA,gCAAA;AAAA,EACA,6BAAA;AAAA,EACA,gCAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA,GAAkB,MAAA;AAAA,EAClB,eAAA,GAAkB,MAAA;AAAA,EAClB,QAAA,GAAW,OAAA;AAAA,EACX,MAAA,GAAS;AACX,CAAA,EAAyD;AACvD,EAAA,MAAM;AAAA,IACF,cAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,MACA,oBAAA,CAAqB;AAAA,IACvB,OAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM;AAAA,IACF,OAAA;AAAA,IACA,IAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,MAEF,wBAAA,CAAyB;AAAA,IACvB,cAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM;AAAA,IACJ,+BAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACE,4BAAA,CAA6B;AAAA,IAC7B,6BAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,gCAAA;AAAA,IACA,gCAAA;AAAA,IACA,gCAAA;AAAA,IACA,WAAA;AAAA,IACA,2BAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,gCAAgC,CAAC,QAAA,KAAwB,2BAAA,CAA4B,EAAE,UAAU,CAAA;AAEvG,EAAA,uBACEP,eAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,kDAAA,EAAqD,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,qBAAA,GAAwB,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,uBAAA,GAA0B,EAAE,CAAA,CAAA;AAAA,MAC1K,aAAA,EAAe,mBAAA;AAAA,MACf,WAAA,EAAa,iBAAA;AAAA,MACb,eAAA,EAAiB,iBAAA;AAAA,MAEjB,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,8DAAA;AAAA,cACV,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM,oBAAA,CAAqB,SAAA,CAAU,YAAA,EAAc,EAAE,CAAC,CAAA;AAAA,cAE9D,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAAA,CACE,gBAAA,IAAoB,uBAAA,EAAyB,EAAE,YAAA,EAAc,sBAAsB,CAAA;AAAA,0BACrFA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,8DAAA;AAAA,cACV,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM,oBAAA,CAAqB,SAAA,CAAU,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,cAE7D,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAA,EAAa,EACnC,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,SAAI,SAAA,EAAU,0BAAA,EAA2B,OAAO,EAAE,KAAA,EAAO,UAAS,EAAG,CAAA;AAAA,YACrE,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdD,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,2DAAA;AAAA,gBACV,KAAA,EAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA,EAAE;AAAA,gBAEzC,QAAA,EAAA;AAAA,kBAAA,CAAA,oBAAA,IAAwB,+BAA+B,QAAQ,CAAA;AAAA,kBAChE,UAAA,CAAW,QAAQ,CAAA,mBAAIC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,QAAA,CAAS,QAAQ,CAAA,EAAE,CAAA,GAAS;AAAA;AAAA,eAAA;AAAA,cAL7G,MAAA,CAAO,SAAS,EAAE;AAAA,aAO1B;AAAA,WAAA,EACH,CAAA;AAAA,0BACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAW,EAC3F,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,EAAE,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAC/DD,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,qCAAA;AAAA,gBACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,KAAK,UAAA,EAAW;AAAA,gBAE3C,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAO,WAAA,GAAc,CAAA,GAAI,EAAA,IAAM,EAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,kBAAE,GAAA;AAAA,kBACjE,MAAA,CAAA,CAAQ,cAAc,CAAA,GAAI,EAAA,IAAM,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA;AAAA,eAAA;AAAA,cAL/C,QAAQ,CAAC,CAAA;AAAA,aAOjB,CAAA,EACH,CAAA;AAAA,4BACAC,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,+BAAA;AAAA,gBACV,KAAA,EAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA,EAAE;AAAA,gBAE3C,QAAA,kBAAAD,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,sBAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA,GAAI,EAAA;AAAA,oBACzC,CAAA;AAAA,oBACA,SAAA,EAAU,uBAAA;AAAA,oBACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,oBAE3B,QAAA,EAAA;AAAA,sBAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,UAAA,GAAa,EAAE,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBAC/DC,cAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BAEC,SAAA,EAAU,gCAAA;AAAA,0BACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,KAAK,UAAA;AAAW,yBAAA;AAAA,wBAFvC,SAAS,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,IAAI,CAAC,CAAA;AAAA,uBAIzC,CAAA;AAAA,sBACA,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,UAAA,GAAa,QAAQ,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACrEA,cAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BAEC,SAAA,EAAU,gCAAA;AAAA,0BACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,WAAW,UAAA;AAAW,yBAAA;AAAA,wBAF7C,SAAS,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,IAAI,CAAC,CAAA;AAAA,uBAIzC,CAAA;AAAA,sBAAA,CACC,iBAAA,CAAkB,IAAI,QAAA,CAAS,EAAE,KAAK,EAAC,EAAG,GAAA,CAAI,CAAC,WAAA,KAAgB;AAC/D,wBAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,KAAA;AACvC,wBAAA,MAAM,GAAA,GAAM,OAAA,GAAU,WAAA,CAAY,QAAA,GAAW,UAAA;AAC7C,wBAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,aAAA,GAAgB,aAAa,WAAA,CAAY,MAAA,GAAS,WAAA,CAAY,QAAA,IAAY,UAAU,CAAA;AAC5G,wBAAA,MAAM,qBAAA,GAAwB,+BAAA,CAAgC,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAC7E,wBAAA,MAAM,0BAAA,GAA6B,uBAAA,CAAwB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAC1E,wBAAA,uBACEA,cAAAA;AAAA,0BAAC,KAAA;AAAA,0BAAA;AAAA,4BAEC,SAAA,EAAU,eAAA;AAAA,4BACV,KAAA,EAAO;AAAA,8BACL,GAAA;AAAA,8BACA,IAAA,EAAM,CAAA,EAAG,YAAA,GAAe,WAAA,CAAY,IAAI,CAAA,CAAA,CAAA;AAAA,8BACxC,KAAA,EAAO,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA,8BACtB;AAAA,6BACF;AAAA,4BAEE,gCAAqB,wBAAA,EAA0B;AAAA,8BAC/C,WAAA;AAAA,8BACA,aAAA,EAAe,CAAC,KAAA,KAAU,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAAA,8BAC9D,mBAAA,EAAqB,CAAC,KAAA,KAAU,mBAAA,CAAoB,OAAO,WAAW,CAAA;AAAA,8BACtE,qBAAA;AAAA,8BACA,0BAAA;AAAA,8BACA,IAAA;AAAA,8BACA;AAAA,6BACD;AAAA,2BAAA;AAAA,0BAjBI,MAAA,CAAO,YAAY,EAAE;AAAA,yBAkB5B;AAAA,sBAEJ,CAAC;AAAA;AAAA;AAAA;AACH,eAAA;AAAA,cAtDK,MAAA,CAAO,SAAS,EAAE;AAAA,aAwD1B,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;ACrMO,SAAS,+BAAA,CACd,YAAA,EACA,MAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAChC,IAAA,IAAI,OAAA,CAAQ,MAAM,IAAI,CAAA,KAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAe,OAAA,CAAQ,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,KAAK,UAAU,CAAA;AACvE,IAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,CAAS,YAAA,EAAc,MAAA,CAAO,KAAK,KAAK,CAAA;AAClE,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EAClD,CAAC,CAAA;AACH","file":"index.cjs","sourcesContent":["import * as React from \"react\";\nimport type { DefaultRenderAppointmentProps } from \"./types\";\nimport type { SchedulerId } from \"../../types/scheduler\";\n\nexport function defaultRenderAppointment<TAppointment, TResourceId extends SchedulerId>({\n appointment,\n onPointerDown,\n onResizePointerDown,\n appointmentAppearance,\n appointmentBackgroundColor\n}: DefaultRenderAppointmentProps<TAppointment, TResourceId>) {\n const rawMaybe = appointment.raw as { description?: unknown };\n const description = typeof rawMaybe.description === \"string\" ? rawMaybe.description : undefined;\n const legacyClassName = typeof appointmentBackgroundColor === \"string\" ? appointmentBackgroundColor : undefined;\n const backgroundClassName = appointmentAppearance?.className ?? legacyClassName ?? \"bg-muted/40 dark:bg-muted/30\";\n const className = `relative h-full cursor-grab overflow-hidden rounded-md border border-border p-2 pb-5 text-foreground ${backgroundClassName}`;\n\n return (\n <div onPointerDown={onPointerDown} className={className}>\n <div className=\"text-xs font-semibold\">{appointment.title}</div>\n {description ? <div className=\"mt-1 text-[10px] font-medium text-muted-foreground\">{description}</div> : null}\n <div\n role=\"button\"\n aria-label=\"Resize appointment\"\n onPointerDown={(event) => {\n event.stopPropagation();\n onResizePointerDown(event);\n }}\n className=\"absolute inset-x-1 bottom-1 h-2 cursor-ns-resize rounded-full bg-border/90 transition-colors hover:bg-border\"\n />\n </div>\n );\n}\n","const OPEN_TIME = '09:00';\nconst CLOSE_TIME = '18:00';\n\nconst STEP_MIN = 15;\nconst MIN_EVENT_MIN = 15;\nconst DEFAULT_CREATE_MIN = 30;\n\nconst PX_PER_MIN = 2; // visual scale\nconst HEADER_H = 56;\nconst GUTTER_W = 72;\nconst TOP_PAD = 12;\nconst BOTTOM_PAD = 24;\n\nconst RESOURCE_MIN_W = 420; // columns expand to fill available width; min width enables x-scroll when needed\nconst RESOURCE_MIN_W_TW = 'min-w-[400px] lg:w-full'; // columns expand to fill available width; min width enables x-scroll when needed\nconst LANE_GAP = 6;\n\nexport {\n OPEN_TIME,\n CLOSE_TIME,\n STEP_MIN,\n MIN_EVENT_MIN,\n DEFAULT_CREATE_MIN,\n PX_PER_MIN,\n HEADER_H,\n GUTTER_W,\n TOP_PAD,\n BOTTOM_PAD,\n RESOURCE_MIN_W,\n LANE_GAP,\n RESOURCE_MIN_W_TW,\n}","import { format } from \"date-fns\";\nimport type { SchedulerAppointmentColorToken } from \"../types/scheduler\";\nimport { STEP_MIN } from \"../components/constants\";\nimport type { LaidOut, NameLike, TimeBlockLike } from \"../hooks/types\";\n\nexport function isNameLike(resource: unknown): resource is NameLike {\n if (!resource || typeof resource !== \"object\") {\n return false;\n }\n const maybe = resource as { firstName?: unknown; lastName?: unknown };\n return typeof maybe.firstName === \"string\" || typeof maybe.lastName === \"string\";\n}\n\nexport function toInputDateValue(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nexport function fromInputDateValue(value: string): Date | null {\n const [yearRaw, monthRaw, dayRaw] = value.split(\"-\");\n const year = Number(yearRaw);\n const month = Number(monthRaw);\n const day = Number(dayRaw);\n if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {\n return null;\n }\n return new Date(year, month - 1, day);\n}\n\nexport const DEFAULT_APPOINTMENT_COLOR_TOKEN_CLASS_MAP: Record<SchedulerAppointmentColorToken, string> = {\n slate: \"bg-slate-100 dark:bg-slate-900/40\",\n gray: \"bg-gray-100 dark:bg-gray-900/40\",\n zinc: \"bg-zinc-100 dark:bg-zinc-900/40\",\n neutral: \"bg-neutral-100 dark:bg-neutral-900/40\",\n stone: \"bg-stone-100 dark:bg-stone-900/40\",\n red: \"bg-red-100 dark:bg-red-950/40\",\n orange: \"bg-orange-100 dark:bg-orange-950/40\",\n amber: \"bg-amber-100 dark:bg-amber-950/40\",\n yellow: \"bg-yellow-100 dark:bg-yellow-950/40\",\n lime: \"bg-lime-100 dark:bg-lime-950/40\",\n green: \"bg-green-100 dark:bg-green-950/40\",\n emerald: \"bg-emerald-100 dark:bg-emerald-950/40\",\n teal: \"bg-teal-100 dark:bg-teal-950/40\",\n cyan: \"bg-cyan-100 dark:bg-cyan-950/40\",\n sky: \"bg-sky-100 dark:bg-sky-950/40\",\n blue: \"bg-blue-100 dark:bg-blue-950/40\",\n indigo: \"bg-indigo-100 dark:bg-indigo-950/40\",\n violet: \"bg-violet-100 dark:bg-violet-950/40\",\n purple: \"bg-purple-100 dark:bg-purple-950/40\",\n fuchsia: \"bg-fuchsia-100 dark:bg-fuchsia-950/40\",\n pink: \"bg-pink-100 dark:bg-pink-950/40\",\n rose: \"bg-rose-100 dark:bg-rose-950/40\"\n};\n\nexport function clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nexport function snap(mins: number, stepMin = STEP_MIN) {\n return Math.round(mins / stepMin) * stepMin;\n}\n\nexport function parseHHMM(hhmm: string) {\n const [h, m] = hhmm.split(\":\").map(Number);\n return h * 60 + m;\n}\n\nexport function fullName<T extends NameLike>(resource: T) {\n return `${resource.firstName ?? \"\"} ${resource.lastName ?? \"\"}`.trim();\n}\n\nexport function dayISO(date: Date) {\n return format(date, \"yyyy-MM-dd\");\n}\n\nexport function shiftDays(date: Date, delta: number) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + delta);\n}\n\nexport function dateAtMinute(selectedDate: Date, dayStartAbs: number, minuteFromStart: number) {\n const base = new Date(\n selectedDate.getFullYear(),\n selectedDate.getMonth(),\n selectedDate.getDate(),\n 0,\n 0,\n 0,\n 0\n );\n const abs = dayStartAbs + minuteFromStart;\n const hh = Math.floor(abs / 60);\n const mm = abs % 60;\n base.setHours(hh, mm, 0, 0);\n return base;\n}\n\nexport function minutesFromDayStart(dayStartAbs: number, date: Date) {\n return date.getHours() * 60 + date.getMinutes() - dayStartAbs;\n}\n\nexport function overlaps(a: TimeBlockLike, b: TimeBlockLike) {\n return a.startMin < b.endMin && b.startMin < a.endMin;\n}\n\nexport function layoutOverlaps<T extends TimeBlockLike>(blocks: T[]): LaidOut<T>[] {\n const sorted = [...blocks].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n const groups: T[][] = [];\n let active: T[] = [];\n let current: T[] = [];\n\n for (const block of sorted) {\n active = active.filter((item) => item.endMin > block.startMin);\n const conflicts = active.some((item) => overlaps(item, block));\n\n if (!conflicts && current.length > 0) {\n groups.push(current);\n current = [];\n }\n current.push(block);\n active.push(block);\n }\n\n if (current.length) {\n groups.push(current);\n }\n\n const output: LaidOut<T>[] = [];\n\n for (const group of groups) {\n const sortedGroup = [...group].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n const laneEnd: number[] = [];\n const laneOf = new Map<T[\"id\"], number>();\n\n for (const block of sortedGroup) {\n let placed = false;\n for (let i = 0; i < laneEnd.length; i++) {\n if (laneEnd[i] <= block.startMin) {\n laneEnd[i] = block.endMin;\n laneOf.set(block.id, i);\n placed = true;\n break;\n }\n }\n if (!placed) {\n laneEnd.push(block.endMin);\n laneOf.set(block.id, laneEnd.length - 1);\n }\n }\n\n const lanes = laneEnd.length;\n for (const block of sortedGroup) {\n output.push({ ...block, lane: laneOf.get(block.id) ?? 0, lanes });\n }\n }\n\n return output;\n}\n","import * as React from \"react\";\nimport type { DefaultRenderDatePickerProps } from \"./types\";\nimport { fromInputDateValue, toInputDateValue } from \"../../utils/scheduler-core.utils\";\n\nexport function defaultRenderDatePicker({ selectedDate, onSelectedDateChange }: DefaultRenderDatePickerProps) {\n return (\n <input\n type=\"date\"\n value={toInputDateValue(selectedDate)}\n onChange={(event) => {\n const nextDate = fromInputDateValue(event.target.value);\n if (nextDate) {\n onSelectedDateChange(nextDate);\n }\n }}\n className=\"h-7 rounded-md border border-border bg-card px-2 text-xs text-foreground\"\n aria-label=\"Select date\"\n />\n );\n}\n","import * as React from \"react\";\nimport type { BaseSchedulerResource, SchedulerId } from \"../../types/scheduler\";\nimport type { DefaultRenderResourceHeaderProps } from \"./types\";\n\nexport function defaultRenderResourceHeader<\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>({ resource }: DefaultRenderResourceHeaderProps<TResource, TResourceId>) {\n return <strong>{resource.label}</strong>;\n}\n","import type {\n BaseSchedulerResource,\n SchedulerAppointmentAppearance,\n SchedulerDragState,\n SchedulerEvent,\n SchedulerId\n} from \"../types/scheduler\";\nimport type {\n BuildResourceMapOptions,\n NormalizeAppointmentsArgs,\n SchedulerLayoutAppointment\n} from \"../hooks/types\";\nimport {\n clamp,\n dateAtMinute,\n dayISO,\n layoutOverlaps,\n minutesFromDayStart\n} from \"./scheduler-core.utils\";\n\nexport function buildResourceMap<TResource, TResourceId extends SchedulerId, TValue>({\n fallback,\n getValue,\n resources,\n toKey\n}: BuildResourceMapOptions<TResource, TResourceId, TValue>) {\n const map = new Map<TResourceId, TValue | undefined>();\n for (const resource of resources) {\n map.set(toKey(resource), getValue(resource) ?? fallback);\n }\n return map;\n}\n\nexport function normalizeAppointments<TAppointment, TResourceId extends SchedulerId>({\n adapter,\n appointments,\n dayMinutes,\n dayStartAbs,\n selectedISO\n}: NormalizeAppointmentsArgs<TAppointment, TResourceId>) {\n return appointments\n .map((appointment) => {\n const start = new Date(adapter.getStart(appointment));\n const end = new Date(adapter.getEnd(appointment));\n return {\n raw: appointment,\n id: adapter.getId(appointment),\n resourceId: adapter.getResourceId(appointment),\n start,\n end,\n startMin: clamp(minutesFromDayStart(dayStartAbs, start), 0, dayMinutes),\n endMin: clamp(minutesFromDayStart(dayStartAbs, end), 0, dayMinutes),\n title: adapter.getTitle(appointment)\n };\n })\n .filter((appointment) => dayISO(appointment.start) === selectedISO);\n}\n\nexport function buildAppointmentMap<TAppointment, TResourceId extends SchedulerId>(appointments: SchedulerEvent<TAppointment, TResourceId>[]) {\n return new Map(appointments.map((appointment) => [appointment.id, appointment]));\n}\n\nexport function applyDragToAppointments<TAppointment, TResourceId extends SchedulerId>(\n appointments: SchedulerEvent<TAppointment, TResourceId>[],\n drag: SchedulerDragState<TResourceId>,\n selectedDate: Date,\n dayStartAbs: number\n) {\n if (drag.kind === \"none\") {\n return appointments;\n }\n\n return appointments.map((appointment) => {\n if (appointment.id !== drag.appointmentId) {\n return appointment;\n }\n\n return {\n ...appointment,\n resourceId: drag.resourceId,\n startMin: drag.startMin,\n endMin: drag.endMin,\n start: dateAtMinute(selectedDate, dayStartAbs, drag.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, drag.endMin)\n };\n });\n}\n\nexport function buildLaidOutByResource<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>(resources: TResource[], appointments: SchedulerEvent<TAppointment, TResourceId>[]) {\n const appointmentsByResource = new Map<TResourceId, SchedulerEvent<TAppointment, TResourceId>[]>();\n\n for (const appointment of appointments) {\n const current = appointmentsByResource.get(appointment.resourceId) ?? [];\n current.push(appointment);\n appointmentsByResource.set(appointment.resourceId, current);\n }\n\n const result = new Map<TResourceId, SchedulerLayoutAppointment<TAppointment, TResourceId>[]>();\n for (const resource of resources) {\n result.set(resource.id, layoutOverlaps(appointmentsByResource.get(resource.id) ?? []));\n }\n return result;\n}\n\nexport function buildAppointmentAppearanceByResource<\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>(\n resources: TResource[],\n resourceAppointmentClassMap: Partial<Record<string, string>> | undefined,\n getResourceAppointmentAppearance: ((resource: TResource) => SchedulerAppointmentAppearance | undefined) | undefined,\n appointmentColorTokenClassByResource: Map<TResourceId, string | undefined>,\n appointmentBgByResource: Map<TResourceId, string | undefined>\n) {\n const map = new Map<TResourceId, SchedulerAppointmentAppearance | undefined>();\n\n for (const resource of resources) {\n const classFromIdMap = resourceAppointmentClassMap?.[String(resource.id)];\n if (classFromIdMap) {\n map.set(resource.id, { className: classFromIdMap });\n continue;\n }\n\n const appearance = getResourceAppointmentAppearance?.(resource);\n if (appearance) {\n map.set(resource.id, appearance);\n continue;\n }\n\n const tokenClass = appointmentColorTokenClassByResource.get(resource.id);\n if (tokenClass) {\n map.set(resource.id, { className: tokenClass });\n continue;\n }\n\n const legacyBackground = appointmentBgByResource.get(resource.id);\n map.set(resource.id, legacyBackground ? { className: legacyBackground } : undefined);\n }\n\n return map;\n}\n","import * as React from \"react\";\nimport { BOTTOM_PAD, GUTTER_W, PX_PER_MIN, RESOURCE_MIN_W, TOP_PAD } from \"../components/constants\";\nimport type { BaseSchedulerResource, SchedulerId } from \"../types/scheduler\";\nimport type { SchedulerBaseData, UseSchedulerBaseDataArgs } from \"./types\";\nimport { buildAppointmentMap, normalizeAppointments } from \"../utils/scheduler-data.utils\";\nimport { dayISO, parseHHMM } from \"../utils/scheduler-core.utils\";\n\nexport function useSchedulerBaseData<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>({\n adapter,\n appointments,\n dayEnd = \"18:00\",\n dayStart = \"09:00\",\n resources,\n selectedDate\n}: UseSchedulerBaseDataArgs<TAppointment, TResource, TResourceId>): SchedulerBaseData<TAppointment, TResourceId> {\n const dayStartAbs = React.useMemo(() => parseHHMM(dayStart), [dayStart]);\n const dayEndAbs = React.useMemo(() => parseHHMM(dayEnd), [dayEnd]);\n const dayMinutes = React.useMemo(() => Math.max(0, dayEndAbs - dayStartAbs), [dayEndAbs, dayStartAbs]);\n const gridHeight = React.useMemo(() => TOP_PAD + dayMinutes * PX_PER_MIN + BOTTOM_PAD, [dayMinutes]);\n const gridMinWidth = React.useMemo(() => GUTTER_W + Math.max(resources.length, 1) * RESOURCE_MIN_W, [resources.length]);\n const selectedISO = React.useMemo(() => dayISO(selectedDate), [selectedDate]);\n\n const renderAppts = React.useMemo(() => {\n return normalizeAppointments({\n adapter,\n appointments,\n dayMinutes,\n dayStartAbs,\n selectedISO\n });\n }, [adapter, appointments, dayMinutes, dayStartAbs, selectedISO]);\n\n const appointmentMap = React.useMemo(() => buildAppointmentMap(renderAppts), [renderAppts]);\n\n return {\n appointmentMap,\n dayEndAbs,\n dayMinutes,\n dayStartAbs,\n gridHeight,\n gridMinWidth,\n renderAppts\n };\n}\n","import * as React from \"react\";\nimport { MIN_EVENT_MIN, PX_PER_MIN, TOP_PAD } from \"../components/constants\";\nimport type { BaseSchedulerResource, SchedulerDragState, SchedulerEvent, SchedulerId } from \"../types/scheduler\";\nimport type { SchedulerInteractions, UseSchedulerInteractionsArgs } from \"./types\";\nimport { clamp, dateAtMinute, overlaps, snap } from \"../utils/scheduler-core.utils\";\n\nexport function useSchedulerInteractions<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>({\n appointmentMap,\n dayMinutes,\n dayStartAbs,\n onAppointmentChange,\n onPersistMoveResize,\n renderAppts,\n resources,\n selectedDate\n}: UseSchedulerInteractionsArgs<TAppointment, TResource, TResourceId>): SchedulerInteractions<TAppointment, TResourceId> {\n const [drag, setDrag] = React.useState<SchedulerDragState<TResourceId>>({ kind: \"none\" });\n const colRefs = React.useRef<Record<string, HTMLDivElement | null>>({});\n const suppressClickRef = React.useRef(false);\n\n const pointerToMin = React.useCallback(\n (resourceId: TResourceId, clientY: number) => {\n const col = colRefs.current[String(resourceId)];\n if (!col) {\n return 0;\n }\n\n const y = clientY - col.getBoundingClientRect().top - TOP_PAD;\n return clamp(snap(y / PX_PER_MIN), 0, dayMinutes);\n },\n [dayMinutes]\n );\n\n const pointerToResourceId = React.useCallback(\n (clientX: number, fallbackResourceId: TResourceId) => {\n for (const resource of resources) {\n const col = colRefs.current[String(resource.id)];\n if (!col) {\n continue;\n }\n\n const rect = col.getBoundingClientRect();\n if (clientX >= rect.left && clientX <= rect.right) {\n return resource.id;\n }\n }\n\n return fallbackResourceId;\n },\n [resources]\n );\n\n const hasOverlap = React.useCallback(\n (appointmentId: SchedulerId, resourceId: TResourceId, startMin: number, endMin: number) => {\n const events = renderAppts.filter((appointment) => appointment.resourceId === resourceId && appointment.id !== appointmentId);\n return events.some((appointment) => overlaps(appointment, { id: appointmentId, startMin, endMin }));\n },\n [renderAppts]\n );\n\n const persistDrag = React.useCallback(\n async (state: Exclude<SchedulerDragState<TResourceId>, { kind: \"none\" }>) => {\n const target = appointmentMap.get(state.appointmentId);\n if (!target) {\n return;\n }\n\n if (hasOverlap(state.appointmentId, state.resourceId, state.startMin, state.endMin)) {\n return;\n }\n\n const next = {\n resourceId: state.resourceId,\n start: dateAtMinute(selectedDate, dayStartAbs, state.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, state.endMin)\n };\n\n if (onAppointmentChange) {\n await onAppointmentChange({\n kind: state.kind,\n appointment: target.raw,\n previous: {\n resourceId: target.resourceId,\n start: target.start,\n end: target.end\n },\n next\n });\n return;\n }\n\n if (onPersistMoveResize) {\n await onPersistMoveResize({\n appointment: target.raw,\n resourceId: next.resourceId,\n start: next.start,\n end: next.end\n });\n }\n },\n [appointmentMap, dayStartAbs, hasOverlap, onAppointmentChange, onPersistMoveResize, selectedDate]\n );\n\n const onApptPointerDown = React.useCallback(\n (event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n suppressClickRef.current = false;\n const pointerMin = pointerToMin(appointment.resourceId, event.clientY);\n setDrag({\n kind: \"move\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n durationMin: Math.max(MIN_EVENT_MIN, appointment.endMin - appointment.startMin),\n offsetMin: pointerMin - appointment.startMin,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n },\n [pointerToMin]\n );\n\n const onResizePointerDown = React.useCallback((event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n suppressClickRef.current = false;\n setDrag({\n kind: \"resize\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n }, []);\n\n const onGlobalPointerMove = React.useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n if (drag.kind === \"none\") {\n return;\n }\n\n if (drag.kind === \"move\") {\n const nextResourceId = pointerToResourceId(event.clientX, drag.resourceId);\n const pointerMin = pointerToMin(nextResourceId, event.clientY);\n const rawStart = pointerMin - drag.offsetMin;\n const nextStartMin = clamp(snap(rawStart), 0, dayMinutes - drag.durationMin);\n const nextEndMin = nextStartMin + drag.durationMin;\n\n if (nextStartMin !== drag.startMin || nextEndMin !== drag.endMin || nextResourceId !== drag.resourceId) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n resourceId: nextResourceId,\n startMin: nextStartMin,\n endMin: nextEndMin\n });\n }\n return;\n }\n\n const pointerMin = pointerToMin(drag.resourceId, event.clientY);\n const nextEndMin = clamp(snap(pointerMin), drag.startMin + MIN_EVENT_MIN, dayMinutes);\n if (nextEndMin !== drag.endMin) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n endMin: nextEndMin\n });\n }\n },\n [dayMinutes, drag, pointerToMin, pointerToResourceId]\n );\n\n const onGlobalPointerUp = React.useCallback(() => {\n if (drag.kind === \"none\") {\n return;\n }\n\n const current = drag;\n setDrag({ kind: \"none\" });\n if (suppressClickRef.current) {\n void persistDrag(current);\n }\n }, [drag, persistDrag]);\n\n return {\n colRefs,\n drag,\n onApptPointerDown,\n onGlobalPointerMove,\n onGlobalPointerUp,\n onResizePointerDown,\n suppressClickRef\n };\n}\n","import * as React from \"react\";\nimport type { BaseSchedulerResource, SchedulerId } from \"../types/scheduler\";\nimport type { SchedulerPresentationData, UseSchedulerPresentationDataArgs } from \"./types\";\nimport {\n applyDragToAppointments,\n buildAppointmentAppearanceByResource,\n buildLaidOutByResource,\n buildResourceMap\n} from \"../utils/scheduler-data.utils\";\nimport { DEFAULT_APPOINTMENT_COLOR_TOKEN_CLASS_MAP } from \"../utils/scheduler-core.utils\";\n\nexport function useSchedulerPresentationData<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId\n>({\n appointmentColorTokenClassMap,\n dayStartAbs,\n drag,\n getResourceAppointmentAppearance,\n getResourceAppointmentBackground,\n getResourceAppointmentColorToken,\n renderAppts,\n resourceAppointmentClassMap,\n resources,\n selectedDate\n}: UseSchedulerPresentationDataArgs<TAppointment, TResource, TResourceId>): SchedulerPresentationData<TAppointment, TResourceId> {\n const effectiveAppts = React.useMemo(() => {\n return applyDragToAppointments(renderAppts, drag, selectedDate, dayStartAbs);\n }, [dayStartAbs, drag, renderAppts, selectedDate]);\n\n const laidOutByResource = React.useMemo(() => {\n return buildLaidOutByResource(resources, effectiveAppts);\n }, [effectiveAppts, resources]);\n\n const appointmentBgByResource = React.useMemo(() => {\n if (!getResourceAppointmentBackground) {\n return new Map<TResourceId, string | undefined>();\n }\n\n return buildResourceMap({\n fallback: undefined,\n getValue: getResourceAppointmentBackground,\n resources,\n toKey: (resource) => resource.id\n });\n }, [getResourceAppointmentBackground, resources]);\n\n const appointmentColorTokenClassByResource = React.useMemo(() => {\n if (!getResourceAppointmentColorToken) {\n return new Map<TResourceId, string | undefined>();\n }\n\n const mergedClassMap = {\n ...DEFAULT_APPOINTMENT_COLOR_TOKEN_CLASS_MAP,\n ...(appointmentColorTokenClassMap ?? {})\n };\n\n return buildResourceMap({\n fallback: undefined,\n getValue: (resource: TResource) => {\n const token = getResourceAppointmentColorToken(resource);\n return token ? mergedClassMap[token] : undefined;\n },\n resources,\n toKey: (resource) => resource.id\n });\n }, [appointmentColorTokenClassMap, getResourceAppointmentColorToken, resources]);\n\n const appointmentAppearanceByResource = React.useMemo(() => {\n return buildAppointmentAppearanceByResource(\n resources,\n resourceAppointmentClassMap,\n getResourceAppointmentAppearance,\n appointmentColorTokenClassByResource,\n appointmentBgByResource\n );\n }, [\n appointmentBgByResource,\n appointmentColorTokenClassByResource,\n getResourceAppointmentAppearance,\n resourceAppointmentClassMap,\n resources\n ]);\n\n return {\n appointmentAppearanceByResource,\n appointmentBgByResource,\n effectiveAppts,\n laidOutByResource\n };\n}\n","import * as React from \"react\";\nimport { defaultRenderAppointment } from \"../defaultRenderAppointment\";\nimport { defaultRenderDatePicker } from \"../defaultRenderDatePicker\";\nimport { defaultRenderResourceHeader } from \"../defaultRenderResourceHeader\";\nimport { GUTTER_W, MIN_EVENT_MIN, PX_PER_MIN, RESOURCE_MIN_W, STEP_MIN, TOP_PAD } from \"../constants\";\nimport type { BaseSchedulerResource, SchedulerId, SchedulerProps } from \"../../types/scheduler\";\nimport { useSchedulerBaseData } from \"../../hooks/useSchedulerBaseData\";\nimport { useSchedulerInteractions } from \"../../hooks/useSchedulerInteractions\";\nimport { useSchedulerPresentationData } from \"../../hooks/useSchedulerPresentationData\";\nimport { fullName, isNameLike, shiftDays } from \"../../utils/scheduler-core.utils\";\n\nexport function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({\n resources,\n appointments,\n selectedDate,\n onSelectedDateChange,\n adapter,\n onPersistMoveResize,\n onAppointmentChange,\n renderResourceHeader,\n renderAppointment,\n resourceAppointmentClassMap,\n getResourceAppointmentAppearance,\n getResourceAppointmentColorToken,\n appointmentColorTokenClassMap,\n getResourceAppointmentBackground,\n renderDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\",\n dayStart = \"09:00\",\n dayEnd = \"18:00\"\n}: SchedulerProps<TAppointment, TResource, TResourceId>) {\n const {\n appointmentMap,\n dayMinutes,\n dayStartAbs,\n gridHeight,\n gridMinWidth,\n renderAppts\n } = useSchedulerBaseData({\n adapter,\n appointments,\n dayEnd,\n dayStart,\n resources,\n selectedDate\n });\n\n const {\n colRefs,\n drag,\n onApptPointerDown,\n onGlobalPointerMove,\n onGlobalPointerUp,\n onResizePointerDown,\n suppressClickRef\n } =\n useSchedulerInteractions({\n appointmentMap,\n dayMinutes,\n dayStartAbs,\n onAppointmentChange,\n onPersistMoveResize,\n renderAppts,\n resources,\n selectedDate\n });\n\n const {\n appointmentAppearanceByResource,\n appointmentBgByResource,\n laidOutByResource\n } = useSchedulerPresentationData({\n appointmentColorTokenClassMap,\n dayStartAbs,\n drag,\n getResourceAppointmentAppearance,\n getResourceAppointmentBackground,\n getResourceAppointmentColorToken,\n renderAppts,\n resourceAppointmentClassMap,\n resources,\n selectedDate\n });\n\n const defaultResourceHeaderRenderer = (resource: TResource) => defaultRenderResourceHeader({ resource });\n\n return (\n <section\n className={`rfs-root rounded-lg bg-background text-foreground ${drag.kind === \"move\" ? \"rfs-root--drag-move\" : \"\"} ${drag.kind === \"resize\" ? \"rfs-root--drag-resize\" : \"\"}`}\n onPointerMove={onGlobalPointerMove}\n onPointerUp={onGlobalPointerUp}\n onPointerCancel={onGlobalPointerUp}\n >\n <div className=\"rfs-toolbar\">\n <button\n className=\"rfs-btn border-border bg-card text-foreground hover:bg-muted\"\n type=\"button\"\n onClick={() => onSelectedDateChange(shiftDays(selectedDate, -1))}\n >\n {prevButtonLabel}\n </button>\n {(renderDatePicker ?? defaultRenderDatePicker)({ selectedDate, onSelectedDateChange })}\n <button\n className=\"rfs-btn border-border bg-card text-foreground hover:bg-muted\"\n type=\"button\"\n onClick={() => onSelectedDateChange(shiftDays(selectedDate, 1))}\n >\n {nextButtonLabel}\n </button>\n </div>\n\n <div className=\"rfs-shell border-border bg-card\">\n <div style={{ minWidth: gridMinWidth }}>\n <div className=\"rfs-header border-border bg-card\">\n <div className=\"rfs-gutter border-border\" style={{ width: GUTTER_W }} />\n {resources.map((resource) => (\n <div\n key={String(resource.id)}\n className=\"rfs-resource-header border-border bg-card text-foreground\"\n style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}\n >\n {(renderResourceHeader ?? defaultResourceHeaderRenderer)(resource)}\n {isNameLike(resource) ? <div className=\"rfs-resource-subtitle text-muted-foreground\">{fullName(resource)}</div> : null}\n </div>\n ))}\n </div>\n <div className=\"rfs-body\">\n <div className=\"rfs-times border-border bg-card\" style={{ width: GUTTER_W, height: gridHeight }}>\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div\n key={`tick-${i}`}\n className=\"rfs-time-tick text-muted-foreground\"\n style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}\n >\n {String(Math.floor((dayStartAbs + i * 60) / 60)).padStart(2, \"0\")}:\n {String((dayStartAbs + i * 60) % 60).padStart(2, \"0\")}\n </div>\n ))}\n </div>\n <div className=\"rfs-grid\">\n {resources.map((resource) => (\n <div\n key={String(resource.id)}\n className=\"rfs-col border-border bg-card\"\n style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}\n >\n <div\n ref={(el) => {\n colRefs.current[String(resource.id)] = el;\n }}\n className=\"rfs-col-inner bg-card\"\n style={{ height: gridHeight }}\n >\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div\n key={`major-${String(resource.id)}-${i}`}\n className=\"rfs-hour-line border-border/70\"\n style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}\n />\n ))}\n {Array.from({ length: Math.floor(dayMinutes / STEP_MIN) + 1 }).map((_, i) => (\n <div\n key={`minor-${String(resource.id)}-${i}`}\n className=\"rfs-slot-line border-border/50\"\n style={{ top: TOP_PAD + i * STEP_MIN * PX_PER_MIN }}\n />\n ))}\n {(laidOutByResource.get(resource.id) ?? []).map((appointment) => {\n const laneWidthPct = 100 / appointment.lanes;\n const top = TOP_PAD + appointment.startMin * PX_PER_MIN;\n const height = Math.max(MIN_EVENT_MIN * PX_PER_MIN, (appointment.endMin - appointment.startMin) * PX_PER_MIN);\n const appointmentAppearance = appointmentAppearanceByResource.get(resource.id);\n const appointmentBackgroundColor = appointmentBgByResource.get(resource.id);\n return (\n <div\n key={String(appointment.id)}\n className=\"rfs-card-slot\"\n style={{\n top,\n left: `${laneWidthPct * appointment.lane}%`,\n width: `${laneWidthPct}%`,\n height\n }}\n >\n {(renderAppointment ?? defaultRenderAppointment)({\n appointment,\n onPointerDown: (event) => onApptPointerDown(event, appointment),\n onResizePointerDown: (event) => onResizePointerDown(event, appointment),\n appointmentAppearance,\n appointmentBackgroundColor,\n drag,\n suppressClickRef\n })}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n","import type { SchedulerAppointmentChangeArgs, SchedulerId } from \"../types\";\n\nexport type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {\n getId: (appointment: TAppointment) => SchedulerId;\n setResourceId: (appointment: TAppointment, resourceId: TResourceId) => TAppointment;\n setStart: (appointment: TAppointment, start: Date) => TAppointment;\n setEnd: (appointment: TAppointment, end: Date) => TAppointment;\n};\n\nexport function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(\n appointments: TAppointment[],\n change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>,\n options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>\n): TAppointment[] {\n return appointments.map((item) => {\n if (options.getId(item) !== options.getId(change.appointment)) {\n return item;\n }\n\n const withResource = options.setResourceId(item, change.next.resourceId);\n const withStart = options.setStart(withResource, change.next.start);\n return options.setEnd(withStart, change.next.end);\n });\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -43,6 +43,25 @@ type SchedulerDragState<TResourceId extends SchedulerId> = {
43
43
  endMin: number;
44
44
  };
45
45
  type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId>;
46
+ type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerId> = {
47
+ kind: "move" | "resize";
48
+ appointment: TAppointment;
49
+ previous: {
50
+ resourceId: TResourceId;
51
+ start: Date;
52
+ end: Date;
53
+ };
54
+ next: {
55
+ resourceId: TResourceId;
56
+ start: Date;
57
+ end: Date;
58
+ };
59
+ };
60
+ type SchedulerAppointmentAppearance = {
61
+ className?: string;
62
+ };
63
+ type SchedulerAppointmentColorToken = string;
64
+ type SchedulerResourceClassMap = Partial<Record<string, string>>;
46
65
  type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId> = {
47
66
  resources: TResource[];
48
67
  appointments: TAppointment[];
@@ -55,32 +74,24 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
55
74
  start: Date;
56
75
  end: Date;
57
76
  }) => Promise<void> | void;
58
- onAppointmentChange?: (args: {
59
- kind: "move" | "resize";
60
- appointment: TAppointment;
61
- previous: {
62
- resourceId: TResourceId;
63
- start: Date;
64
- end: Date;
65
- };
66
- next: {
67
- resourceId: TResourceId;
68
- start: Date;
69
- end: Date;
70
- };
71
- }) => Promise<void> | void;
72
- renderResourceHeader: (resource: TResource) => React.ReactNode;
73
- renderAppointment: (args: {
77
+ onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
78
+ renderResourceHeader?: (resource: TResource) => React.ReactNode;
79
+ renderAppointment?: (args: {
74
80
  appointment: SchedulerEvent<TAppointment, TResourceId> & {
75
81
  lane: number;
76
82
  lanes: number;
77
83
  };
78
84
  onPointerDown: (e: React.PointerEvent) => void;
79
85
  onResizePointerDown: (e: React.PointerEvent) => void;
86
+ appointmentAppearance?: SchedulerAppointmentAppearance;
80
87
  appointmentBackgroundColor?: string;
81
88
  drag: SchedulerDragState<TResourceId>;
82
89
  suppressClickRef: RefObject<boolean>;
83
90
  }) => React.ReactNode;
91
+ resourceAppointmentClassMap?: SchedulerResourceClassMap;
92
+ getResourceAppointmentAppearance?: (resource: TResource) => SchedulerAppointmentAppearance | undefined;
93
+ getResourceAppointmentColorToken?: (resource: TResource) => SchedulerAppointmentColorToken | undefined;
94
+ appointmentColorTokenClassMap?: Record<SchedulerAppointmentColorToken, string>;
84
95
  getResourceAppointmentBackground?: (resource: TResource) => string | undefined;
85
96
  renderDatePicker?: (args: {
86
97
  selectedDate: Date;
@@ -92,6 +103,14 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
92
103
  dayEnd?: string;
93
104
  };
94
105
 
95
- declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
106
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
107
+
108
+ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
109
+ getId: (appointment: TAppointment) => SchedulerId;
110
+ setResourceId: (appointment: TAppointment, resourceId: TResourceId) => TAppointment;
111
+ setStart: (appointment: TAppointment, start: Date) => TAppointment;
112
+ setEnd: (appointment: TAppointment, end: Date) => TAppointment;
113
+ };
114
+ declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
96
115
 
97
- export { type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps };
116
+ export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps, type SchedulerResourceClassMap, applySchedulerAppointmentChange };
package/dist/index.d.ts CHANGED
@@ -43,6 +43,25 @@ type SchedulerDragState<TResourceId extends SchedulerId> = {
43
43
  endMin: number;
44
44
  };
45
45
  type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId>;
46
+ type SchedulerAppointmentChangeArgs<TAppointment, TResourceId extends SchedulerId> = {
47
+ kind: "move" | "resize";
48
+ appointment: TAppointment;
49
+ previous: {
50
+ resourceId: TResourceId;
51
+ start: Date;
52
+ end: Date;
53
+ };
54
+ next: {
55
+ resourceId: TResourceId;
56
+ start: Date;
57
+ end: Date;
58
+ };
59
+ };
60
+ type SchedulerAppointmentAppearance = {
61
+ className?: string;
62
+ };
63
+ type SchedulerAppointmentColorToken = string;
64
+ type SchedulerResourceClassMap = Partial<Record<string, string>>;
46
65
  type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId> = {
47
66
  resources: TResource[];
48
67
  appointments: TAppointment[];
@@ -55,32 +74,24 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
55
74
  start: Date;
56
75
  end: Date;
57
76
  }) => Promise<void> | void;
58
- onAppointmentChange?: (args: {
59
- kind: "move" | "resize";
60
- appointment: TAppointment;
61
- previous: {
62
- resourceId: TResourceId;
63
- start: Date;
64
- end: Date;
65
- };
66
- next: {
67
- resourceId: TResourceId;
68
- start: Date;
69
- end: Date;
70
- };
71
- }) => Promise<void> | void;
72
- renderResourceHeader: (resource: TResource) => React.ReactNode;
73
- renderAppointment: (args: {
77
+ onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
78
+ renderResourceHeader?: (resource: TResource) => React.ReactNode;
79
+ renderAppointment?: (args: {
74
80
  appointment: SchedulerEvent<TAppointment, TResourceId> & {
75
81
  lane: number;
76
82
  lanes: number;
77
83
  };
78
84
  onPointerDown: (e: React.PointerEvent) => void;
79
85
  onResizePointerDown: (e: React.PointerEvent) => void;
86
+ appointmentAppearance?: SchedulerAppointmentAppearance;
80
87
  appointmentBackgroundColor?: string;
81
88
  drag: SchedulerDragState<TResourceId>;
82
89
  suppressClickRef: RefObject<boolean>;
83
90
  }) => React.ReactNode;
91
+ resourceAppointmentClassMap?: SchedulerResourceClassMap;
92
+ getResourceAppointmentAppearance?: (resource: TResource) => SchedulerAppointmentAppearance | undefined;
93
+ getResourceAppointmentColorToken?: (resource: TResource) => SchedulerAppointmentColorToken | undefined;
94
+ appointmentColorTokenClassMap?: Record<SchedulerAppointmentColorToken, string>;
84
95
  getResourceAppointmentBackground?: (resource: TResource) => string | undefined;
85
96
  renderDatePicker?: (args: {
86
97
  selectedDate: Date;
@@ -92,6 +103,14 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
92
103
  dayEnd?: string;
93
104
  };
94
105
 
95
- declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
106
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
107
+
108
+ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
109
+ getId: (appointment: TAppointment) => SchedulerId;
110
+ setResourceId: (appointment: TAppointment, resourceId: TResourceId) => TAppointment;
111
+ setStart: (appointment: TAppointment, start: Date) => TAppointment;
112
+ setEnd: (appointment: TAppointment, end: Date) => TAppointment;
113
+ };
114
+ declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
96
115
 
97
- export { type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps };
116
+ export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps, type SchedulerResourceClassMap, applySchedulerAppointmentChange };