@marco.colia/react-fast-scheduler 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -66
- package/dist/index.cjs +902 -439
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +902 -439
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +11 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/defaultRenderAppointment/index.tsx","../src/lib/cn.ts","../src/components/ui/button.tsx","../src/components/ui/calendar.tsx","../src/components/ui/popover.tsx","../src/components/defaultRenderDatePicker/index.tsx","../src/components/defaultRenderResourceHeader/index.tsx","../src/components/defaultRenderToolbar/index.tsx","../src/components/constants.ts","../src/utils/scheduler-core.utils.ts","../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","React","Button","React2","startOfMonth","startOfWeek","endOfWeek","endOfMonth","addDays","addMonths","format","isSameDay","isSameMonth","isToday","React3","React4","React5","pointerMin","nextEndMin","React6"],"mappings":"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","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","export function cn(...inputs: Array<string | false | null | undefined>) {\n return inputs.filter(Boolean).join(\" \");\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\ntype ButtonVariant = \"default\" | \"outline\" | \"ghost\";\ntype ButtonSize = \"default\" | \"sm\" | \"icon\";\n\nconst variantClasses: Record<ButtonVariant, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n outline: \"border border-border bg-card text-foreground hover:bg-muted\",\n ghost: \"text-foreground hover:bg-muted\"\n};\n\nconst sizeClasses: Record<ButtonSize, string> = {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 px-3 text-xs\",\n icon: \"h-8 w-8\"\n};\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { className, variant = \"default\", size = \"default\", type = \"button\", ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"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\",\n variantClasses[variant],\n sizeClasses[size],\n className\n )}\n {...props}\n />\n );\n});\n","import * as React from \"react\";\nimport {\n addDays,\n addMonths,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isToday,\n startOfMonth,\n startOfWeek\n} from \"date-fns\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"./button\";\n\nexport function Calendar({\n selected,\n onSelect\n}: {\n selected?: Date;\n onSelect?: (date: Date) => void;\n}) {\n const [month, setMonth] = React.useState(selected ?? new Date());\n\n React.useEffect(() => {\n if (selected) {\n setMonth(selected);\n }\n }, [selected]);\n\n const monthStart = startOfMonth(month);\n const calendarStart = startOfWeek(monthStart, { weekStartsOn: 1 });\n const calendarEnd = endOfWeek(endOfMonth(month), { weekStartsOn: 1 });\n const days: Date[] = [];\n\n for (let day = calendarStart; day <= calendarEnd; day = addDays(day, 1)) {\n days.push(day);\n }\n\n return (\n <div className=\"w-72 rounded-md bg-popover\">\n <div className=\"mb-2 flex items-center justify-between\">\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Previous month\" onClick={() => setMonth(addMonths(month, -1))}>\n {\"<\"}\n </Button>\n <div className=\"text-sm font-medium\">{format(month, \"MMMM yyyy\")}</div>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Next month\" onClick={() => setMonth(addMonths(month, 1))}>\n {\">\"}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-7 gap-1 text-center text-xs text-muted-foreground\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((label) => (\n <div key={label} className=\"py-1\">\n {label}\n </div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((day) => {\n const isSelected = selected ? isSameDay(day, selected) : false;\n return (\n <Button\n key={day.toISOString()}\n variant={isSelected ? \"default\" : \"ghost\"}\n size=\"icon\"\n className={cn(\n \"text-xs\",\n !isSameMonth(day, month) && \"text-muted-foreground opacity-60\",\n isToday(day) && !isSelected && \"border border-border\"\n )}\n onClick={() => onSelect?.(day)}\n >\n {format(day, \"d\")}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null);\n\nfunction usePopoverContext() {\n const context = React.useContext(PopoverContext);\n if (!context) {\n throw new Error(\"Popover components must be used within Popover.\");\n }\n\n return context;\n}\n\nexport function Popover({\n children,\n open: controlledOpen,\n onOpenChange\n}: {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const open = controlledOpen ?? uncontrolledOpen;\n\n const setOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (value) => {\n const nextValue = typeof value === \"function\" ? value(open) : value;\n if (controlledOpen === undefined) {\n setUncontrolledOpen(nextValue);\n }\n onOpenChange?.(nextValue);\n },\n [controlledOpen, onOpenChange, open]\n );\n\n React.useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.current?.contains(target) || contentRef.current?.contains(target)) {\n return;\n }\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open, setOpen]);\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef, contentRef }}>\n <div className=\"relative inline-flex\">{children}</div>\n </PopoverContext.Provider>\n );\n}\n\nexport function PopoverTrigger({\n children,\n asChild = false\n}: {\n children: React.ReactNode;\n asChild?: boolean;\n}) {\n const { open, setOpen, triggerRef } = usePopoverContext();\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n ref?: React.Ref<HTMLElement>;\n \"aria-expanded\"?: boolean;\n }>;\n\n return React.cloneElement(child, {\n ref: triggerRef,\n \"aria-expanded\": open,\n onClick: (event: React.MouseEvent) => {\n child.props.onClick?.(event);\n setOpen((current) => !current);\n }\n });\n }\n\n return (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n >\n {children}\n </button>\n );\n}\n\nexport function PopoverContent({\n children,\n className,\n align = \"start\"\n}: {\n children: React.ReactNode;\n className?: string;\n align?: \"start\" | \"center\" | \"end\";\n}) {\n const { open, contentRef } = usePopoverContext();\n\n if (!open) {\n return null;\n }\n\n return (\n <div\n ref={contentRef}\n className={cn(\n \"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\",\n align === \"start\" && \"left-0\",\n align === \"center\" && \"left-1/2 -translate-x-1/2\",\n align === \"end\" && \"right-0\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { format } from \"date-fns\";\nimport type { DefaultRenderDatePickerProps } from \"./types\";\nimport { Button } from \"../ui/button\";\nimport { Calendar } from \"../ui/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\n\nexport function defaultRenderDatePicker({ selectedDate, onSelectedDateChange }: DefaultRenderDatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"min-w-40 justify-start text-left font-normal\">\n {format(selectedDate, \"PPP\")}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-2\" align=\"center\">\n <Calendar selected={selectedDate} onSelect={onSelectedDateChange} />\n </PopoverContent>\n </Popover>\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 * as React from \"react\";\nimport type { SchedulerToolbarRenderArgs } from \"../../types\";\nimport { Button } from \"../ui/button\";\n\ntype DefaultRenderToolbarProps = SchedulerToolbarRenderArgs & {\n prevButtonLabel?: React.ReactNode;\n nextButtonLabel?: React.ReactNode;\n};\n\nexport function defaultRenderToolbar({\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\"\n}: DefaultRenderToolbarProps) {\n return (\n <div className=\"rfs-toolbar\">\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-1 shadow-xs\">\n <Button variant=\"outline\" size=\"sm\" onClick={goToPreviousDay}>\n {prevButtonLabel}\n </Button>\n {defaultDatePicker}\n <Button variant=\"outline\" size=\"sm\" onClick={goToNextDay}>\n {nextButtonLabel}\n </Button>\n </div>\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 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 { defaultRenderToolbar } from \"../defaultRenderToolbar\";\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 renderToolbar,\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 const goToPreviousDay = () => onSelectedDateChange(shiftDays(selectedDate, -1));\n const goToNextDay = () => onSelectedDateChange(shiftDays(selectedDate, 1));\n const defaultDatePicker = (renderDatePicker ?? defaultRenderDatePicker)({ selectedDate, onSelectedDateChange });\n const toolbar = renderToolbar ? (\n renderToolbar({\n selectedDate,\n onSelectedDateChange,\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker\n })\n ) : (\n defaultRenderToolbar({\n selectedDate,\n onSelectedDateChange,\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker,\n prevButtonLabel,\n nextButtonLabel\n })\n );\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 {toolbar}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/defaultRenderAppointment/index.tsx","../src/components/constants.ts","../src/utils/scheduler-core.utils.ts","../src/utils/scheduler-data.utils.ts","../src/hooks/useSchedulerBaseData.ts","../src/hooks/useSchedulerInteractions.helpers.ts","../src/hooks/useSchedulerInteractions.ts","../src/hooks/useSchedulerPresentationData.ts","../src/components/scheduler/parts/Gutter.tsx","../src/components/defaultRenderResourceHeader/index.tsx","../src/components/scheduler/parts/Header.tsx","../src/components/scheduler/parts/ResourceColInner.tsx","../src/components/scheduler/parts/ResourceCol.tsx","../src/lib/cn.ts","../src/components/ui/button.tsx","../src/components/ui/calendar.tsx","../src/components/ui/popover.tsx","../src/components/defaultRenderDatePicker/index.tsx","../src/components/defaultRenderToolbar/index.tsx","../src/components/scheduler/parts/Toolbar.tsx","../src/components/scheduler/index.tsx","../src/utils/scheduler-appointment-change.utils.ts"],"names":["jsxs","jsx","format","React","nextDrag","React2","React3","React4","React5","Button","React6","startOfMonth","startOfWeek","endOfWeek","endOfMonth","addDays","addMonths","isSameDay","isSameMonth","isToday","React7","Fragment","React8"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,SAAS,wBAAA,CAAwE;AAAA,EACtF,WAAA;AAAA,EACA,aAAA;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,GACJ,OAAO,0BAAA,KAA+B,QAAA,GAAW,0BAAA,GAA6B,MAAA;AAChF,EAAA,MAAM,mBAAA,GACJ,qBAAA,EAAuB,SAAA,IAAa,eAAA,IAAmB,8BAAA;AACzD,EAAA,MAAM,qBAAA,GAAwB,gBAC1B,uGAAA,GACA,EAAA;AACJ,EAAA,MAAM,oBAAA,GACJ,YAAY,WAAA,KAAgB,OAAA,GACxB,yCACA,WAAA,CAAY,WAAA,KAAgB,aAC1B,4DAAA,GACA,aAAA;AACR,EAAA,MAAM,YAAY,CAAA,yFAAA,EAA4F,mBAAmB,CAAA,CAAA,EAAI,qBAAqB,IAAI,oBAAoB,CAAA,CAAA;AAElL,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA;AAAA,MACA,SAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,aAAA,mBACCC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0HAAA,EAA2H,eAE1I,CAAA,GACE,IAAA;AAAA,wBACJA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,sBAAY,KAAA,EAAM,CAAA;AAAA,QACzD,8BACCA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAsD,uBAAY,CAAA,GAC/E,IAAA;AAAA,wBACJA,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,oBAAA;AAAA,YACX,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,cAAA,IAAI,WAAA,CAAY,gBAAgB,OAAA,EAAS;AACvC,gBAAA;AAAA,cACF;AACA,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,YAC3B,CAAA;AAAA,YACA,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ;;;ACvDA,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;ACPhB,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;AAoBO,IAAM,yCAAA,GAGT;AAAA,EACF,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;;;AC7IO,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,CAAA;AAAA,MACnC,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,MAC5C,WAAA,EAAa;AAAA,KACf;AAAA,EACF,CAAC,EACA,MAAA,CAAO,CAAC,gBAAgB,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA,KAAM,WAAW,CAAA;AACtE;AAEO,SAAS,oBACd,YAAA,EACA;AACA,EAAA,OAAO,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,KAAgB,CAAC,WAAA,CAAY,EAAA,EAAI,WAAW,CAAC,CAAC,CAAA;AACjF;AAEO,SAAS,6BAAA,CACd,YAAA,EACA,IAAA,EACA,YAAA,EACA,WAAA,EAC+D;AAC/D,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,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,CAAA;AAAA,MACxD,WAAA,EAAa;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,sBAAA,CAKd,WACA,YAAA,EACA;AACA,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAGjC;AAEF,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,wBAAA,CAAyB,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,EAAE,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBACd,YAAA,EACA;AACA,EAAA,OAAO,cAAA;AAAA,IACL,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,MACjC,GAAG,WAAA;AAAA,MACH,eAAe,WAAA,CAAY,EAAA;AAAA,MAC3B,IAAI,WAAA,CAAY;AAAA,KAClB,CAAE;AAAA,IACF,GAAA,CAAI,CAAC,EAAE,aAAA,EAAe,GAAG,aAAY,MAAO;AAAA,IAC5C,GAAG,WAAA;AAAA,IACH,EAAA,EAAI;AAAA,GACN,CAAE,CAAA;AACJ;AAEO,SAAS,oCAAA,CAId,SAAA,EACA,2BAAA,EACA,gCAAA,EAGA,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;ACxKO,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,EAGE;AACA,EAAA,MAAM,WAAA,GAAoBC,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;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,WAAW,CAAA;AAAA,IACzC,CAAC,WAAW,WAAW;AAAA,GACzB;AACA,EAAA,MAAM,UAAA,GAAmBA,iBAAA,CAAA,OAAA;AAAA,IACvB,MAAM,OAAA,GAAU,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,IAC1C,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,YAAA,GAAqBA,iBAAA,CAAA,OAAA;AAAA,IACzB,MAAM,QAAA,GAAW,IAAA,CAAK,IAAI,SAAA,CAAU,MAAA,EAAQ,CAAC,CAAA,GAAI,cAAA;AAAA,IACjD,CAAC,UAAU,MAAM;AAAA,GACnB;AACA,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;;;ACvDO,IAAM,uBAAA,GAA0B,CAAA;AA6BhC,IAAM,yBAAA,GAA4B,CACvC,cAAA,EACA,OAAA,KACG;AACH,EAAA,cAAA;AAAA,IAAe,CAAC,YACd,OAAA,GACI;AAAA,MACE,GAAG,OAAA;AAAA,MACH,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KACnB,GACA;AAAA,GACN;AACF,CAAA;AAEO,IAAM,iCAAA,GAAoC,CAC/C,IAAA,KAQG;AACH,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAgB,SAAS,OAAA,EAAS,cAAA,EAAgB,kBAAiB,GAAI,IAAA;AACxF,EAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAA,CAAK,SAAA,KAAc,QAAQ,SAAA,EAAW;AAC5D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,YAAA;AACzC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,YAAA;AACzC,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAI,uBAAA,EAAyB;AACxD,IAAA;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,EAAA,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAA;AAC1B,EAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAChC,IAAA,cAAA,CAAe;AAAA,MACb,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH;AACA,EAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAC3B,CAAA;AAEO,IAAM,oBAAoB,CAC/B,IAAA,EACA,OAAA,EACA,UAAA,EACA,qBACA,YAAA,KACG;AACH,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,OAAA,CAAQ,OAAA,EAAS,KAAK,UAAU,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,cAAA,EAAgB,OAAA,CAAQ,OAAO,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,CAAK,SAAA;AACnC,EAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,QAAQ,GAAG,CAAA,EAAG,UAAA,GAAa,KAAK,WAAW,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,eAAe,IAAA,CAAK,WAAA;AAEvC,EAAA,IACE,YAAA,KAAiB,KAAK,QAAA,IACtB,UAAA,KAAe,KAAK,MAAA,IACpB,cAAA,KAAmB,KAAK,UAAA,EACxB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AACF,CAAA;AAEO,IAAM,mBAAA,GAAsB,CACjC,IAAA,EACA,OAAA,EACA,YACA,YAAA,KACG;AACH,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,QAAQ,OAAO,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAU,GAAG,IAAA,CAAK,QAAA,GAAW,eAAe,UAAU,CAAA;AACpF,EAAA,IAAI,UAAA,KAAe,KAAK,MAAA,EAAQ;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAA,EAAQ;AAAA,GACV;AACF,CAAA;AAEO,IAAM,mBAAA,GAAsB,CACjC,IAAA,KAWG;AACH,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AACJ,EAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA;AACjC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAE5B,EAAA,IAAI,WAAA,CAAY,IAAA,KAAS,MAAA,IAAU,cAAA,CAAe,OAAA,EAAS;AACzD,IAAA,iCAAA,CAAkC;AAAA,MAChC,OAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAQ;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAQ;AAC/B,IAAA,yBAAA,CAA0B,gBAAgB,OAAO,CAAA;AACjD,IAAA,MAAMC,SAAAA,GAAW,iBAAA;AAAA,MACf,WAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAIA,SAAAA,EAAU;AACZ,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,OAAA,CAAQ,OAAA,GAAUA,SAAAA;AAClB,MAAA,OAAA,CAAQA,SAAQ,CAAA;AAAA,IAClB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,WAAA,EAAa,OAAA,EAAS,YAAY,YAAY,CAAA;AACnF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,IAAA,OAAA,CAAQ,OAAA,GAAU,QAAA;AAClB,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAClB;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,CACxB,IAAA,KAUG;AACH,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AACJ,EAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,IAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAC5C,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,EACrB;AACA,EAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,EAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,EAAA,cAAA,CAAe,IAAI,CAAA;AACnB,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AACxB,EAAA,OAAA,CAAQ,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AACjC,EAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,IAAA,KAAK,YAAY,OAAO,CAAA;AAAA,EAC1B;AACF,CAAA;;;ACjOO,IAAM,2BAA2B,CAItC;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,KAGK;AACH,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAUC,2BAA0C,EAAE,IAAA,EAAM,QAAQ,CAAA;AACxF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,iBAAA,CAAA,QAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAgBA,iBAAA,CAAA,MAAA,CAA8C,EAAE,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAyBA,yBAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAgBA,iBAAA,CAAA,MAAA,CAAwC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9E,EAAA,MAAM,cAAA,GAAuBA,yBAAsD,IAAI,CAAA;AACvF,EAAA,MAAM,gBAAA,GAAyBA,yBAA+B,IAAI,CAAA;AAClE,EAAA,MAAM,QAAA,GAAiBA,yBAAsB,IAAI,CAAA;AAEjD,EAAMA,4BAAU,MAAM;AACpB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAMA,4BAAU,MAAM;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,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,SAAS,WAAA,CAAY,MAAA;AAAA,QACzB,CAAC,WAAA,KAAgB,WAAA,CAAY,UAAA,KAAe,UAAA,IAAc,YAAY,EAAA,KAAO;AAAA,OAC/E;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,QAAK,CAAC,gBAClB,QAAA,CAAS,WAAA,EAAa,EAAqB,QAAA,EAAU,MAAA,EAAQ;AAAA,OAC/D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAsBA,0BAAQ,MAAM;AACxC,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,UAAA,CAAW,KAAK,aAAA,EAAe,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EACnF,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAErB,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;AAAA,MACE,cAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,iBAAA,GAA0BA,iBAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,OAA2B,WAAA,KAA6E;AACvG,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,IAAA,GAAQ,KAAA,CAAM,aAAA,CAAiC,qBAAA,EAAsB;AAC3E,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,WAAA,CAAY,UAAA,EAAY,MAAM,OAAO,CAAA;AACrE,MAAA,cAAA,CAAe,OAAA,GAAU;AAAA,QACvB,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,eAAe,WAAA,CAAY,EAAA;AAAA,UAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,aAAa,IAAA,CAAK,GAAA,CAAI,eAAe,WAAA,CAAY,MAAA,GAAS,YAAY,QAAQ,CAAA;AAAA,UAC9E,SAAA,EAAW,aAAa,WAAA,CAAY,QAAA;AAAA,UACpC,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,QAAQ,WAAA,CAAY;AAAA,SACtB;AAAA,QACA,WAAA;AAAA,QACA,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,QAC9B,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK;AAAA,OAChC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,mBAAA,GAA4BA,iBAAA,CAAA,WAAA;AAAA,IAChC,CAAC,OAA2B,WAAA,KAA6E;AACvG,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,cAAA,CAAe,OAAA,GAAU;AAAA,QACvB,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,eAAe,WAAA,CAAY,EAAA;AAAA,UAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,QAAQ,WAAA,CAAY;AAAA,SACtB;AAAA,QACA,WAAA;AAAA,QACA,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,mBAAA,GAA4BA,iBAAA,CAAA,WAAA;AAAA,IAChC,CAAC,KAAA,KAA2C;AAC1C,MAAA,gBAAA,CAAiB,OAAA,GAAU;AAAA,QACzB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM;AAAA,OACnB;AAEA,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,qBAAA,CAAsB,MAAM;AACpD,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,mBAAA,CAAoB;AAAA,UAClB,UAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,mBAAA;AAAA,UACA,OAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,YAAA,EAAc,mBAAmB;AAAA,GAChD;AAEA,EAAA,MAAM,iBAAA,GAA0BA,8BAAY,MAAM;AAChD,IAAA,UAAA,CAAW;AAAA,MACT,OAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AC1QO,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,EAIyD;AACvD,EAAA,MAAM,cAAA,GAAuBC,0BAAQ,MAAM;AACzC,IAAA,OAAO,6BAAA,CAA8B,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAAA,EACnF,GAAG,CAAC,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,YAAY,CAAC,CAAA;AAEjD,EAAA,MAAM,qBAAA,GAA8BA,0BAAQ,MAAM;AAChD,IAAA,OAAO,sBAAA,CAAuB,WAAW,WAAW,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,iBAAA,GAA0BA,0BAAQ,MAAM;AAC5C,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,OAAO,qBAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,qBAAqB,CAAA;AAC1C,IAAA,MAAM,8BAA8B,cAAA,CAAe,MAAA;AAAA,MACjD,CAAC,WAAA,KAAgB,WAAA,CAAY,UAAA,KAAe,IAAA,CAAK;AAAA,KACnD;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,wBAAA,CAAyB,2BAA2B,CAAC,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,qBAAA,EAAuB,IAAA,EAAM,cAAc,CAAC,CAAA;AAEhD,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;ACtGO,SAAS,MAAA,CAAO,EAAE,UAAA,EAAY,WAAA,EAAa,YAAW,EAAyB;AACpF,EAAA,uBACEL,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,UAAA,EAAW;AAAA,MAE5C,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,UAAA,GAAa,EAAE,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBAC/DD,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,qCAAA;AAAA,UACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,KAAK,UAAA,EAAW;AAAA,UAE3C,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAO,WAAA,GAAc,CAAA,GAAI,EAAA,IAAM,EAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,YAAE,GAAA;AAAA,YACjE,MAAA,CAAA,CAAQ,cAAc,CAAA,GAAI,EAAA,IAAM,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA;AAAA,SAAA;AAAA,QAL/C,QAAQ,CAAC,CAAA;AAAA,OAOjB;AAAA;AAAA,GACH;AAEJ;ACtBO,SAAS,2BAAA,CAGd,EAAE,QAAA,EAAS,EAA6D;AACxE,EAAA,uBAAOC,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,QAAA,CAAS,KAAA,EAAM,CAAA;AACjC;ACMO,SAAS,MAAA,CAGd,EAAE,SAAA,EAAW,oBAAA,EAAqB,EAAiD;AACnF,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0BAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA;AAAS;AAAA,KAC3B;AAAA,IACC,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdD,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,2DAAA;AAAA,QACV,KAAA,EAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA,EAAE;AAAA,QAEzC,QAAA,EAAA;AAAA,UAAA,CAAA,oBAAA,KAAyB,CAAC,CAAA,KAAM,2BAAA,CAA4B,EAAE,QAAA,EAAU,GAAG,CAAA,CAAA;AAAA,YAC3E;AAAA,WACF;AAAA,UACC,UAAA,CAAW,QAAQ,CAAA,mBAClBC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,QAAA,CAAS,QAAQ,CAAA,EAAE,CAAA,GAC/E;AAAA;AAAA,OAAA;AAAA,MATC,MAAA,CAAO,SAAS,EAAE;AAAA,KAW1B;AAAA,GAAA,EACH,CAAA;AAEJ;AClCO,IAAM,mBAAmB,CAAgD;AAAA,EAC9E,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAA+D;AAC7D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,KAAA,EAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA,EAAE;AAAA,MAE3C,QAAA,kBAAAD,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,YAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA,GAAI,EAAA;AAAA,UACzC,CAAA;AAAA,UACA,SAAA,EAAU,uBAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,UAE3B,QAAA,EAAA;AAAA,YAAA,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,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,gCAAA;AAAA,gBACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,KAAK,UAAA;AAAW,eAAA;AAAA,cAFvC,SAAS,CAAC,CAAA;AAAA,aAIlB,CAAA;AAAA,YACA,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,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,gCAAA;AAAA,gBACV,OAAO,EAAE,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,WAAW,UAAA;AAAW,eAAA;AAAA,cAF7C,SAAS,CAAC,CAAA;AAAA,aAIlB,CAAA;AAAA,YACA,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,KAAgB;AACjC,cAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,KAAA;AACvC,cAAA,MAAM,GAAA,GAAM,OAAA,GAAU,WAAA,CAAY,QAAA,GAAW,UAAA;AAC7C,cAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,gBAClB,aAAA,GAAgB,UAAA;AAAA,gBAAA,CACf,WAAA,CAAY,MAAA,GAAS,WAAA,CAAY,QAAA,IAAY;AAAA,eAChD;AACA,cAAA,uBACEA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,CAAA,cAAA,EACT,WAAA,CAAY,WAAA,KAAgB,OAAA,GAAU,sBAAA,GAAyB,EACjE,CAAA,CAAA,EAAI,WAAA,CAAY,WAAA,KAAgB,UAAA,GAAa,yBAAA,GAA4B,EAAE,CAAA,CAAA;AAAA,kBAC3E,KAAA,EAAO;AAAA,oBACL,GAAA;AAAA,oBACA,IAAA,EAAM,CAAA,EAAG,YAAA,GAAe,WAAA,CAAY,IAAI,CAAA,CAAA,CAAA;AAAA,oBACxC,KAAA,EAAO,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA,oBACtB;AAAA,mBACF;AAAA,kBAEE,gCAAqB,wBAAA,EAA0B;AAAA,oBAC/C,WAAA;AAAA,oBACA,eACE,aAAA,IACA,IAAA,CAAK,SAAS,QAAA,IACd,WAAA,CAAY,OAAO,IAAA,CAAK,aAAA;AAAA,oBAC1B,aAAA,EAAe,CAAC,KAAA,KAAU,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAAA,oBAC9D,mBAAA,EAAqB,CAAC,KAAA,KAAU,mBAAA,CAAoB,OAAO,WAAW,CAAA;AAAA,oBACtE,qBAAA;AAAA,oBACA,0BAAA,EAA4B,aAAA;AAAA,oBAC5B,IAAA;AAAA,oBACA;AAAA,mBACD;AAAA,iBAAA;AAAA,gBAvBI,WAAA,CAAY;AAAA,eAwBnB;AAAA,YAEJ,CAAC;AAAA;AAAA;AAAA;AACH;AAAA,GACF;AAEJ,CAAA;;;ACjFA,IAAM,oBAAA,GAAuB,CAC3B,IAAA,EACA,IAAA,KAEA;AAAA,EACE,IAAA,CAAK,aAAa,IAAA,CAAK,QAAA;AAAA,EACvB,IAAA,CAAK,YAAY,IAAA,CAAK,OAAA;AAAA,EACtB,IAAA,CAAK,eAAe,IAAA,CAAK,UAAA;AAAA,EACzB,IAAA,CAAK,eAAe,IAAA,CAAK,UAAA;AAAA,EACzB,IAAA,CAAK,iBAAiB,IAAA,CAAK,YAAA;AAAA,EAC3B,IAAA,CAAK,0BAA0B,IAAA,CAAK,qBAAA;AAAA,EACpC,IAAA,CAAK,kBAAkB,IAAA,CAAK,aAAA;AAAA,EAC5B,IAAA,CAAK,kBAAkB,IAAA,CAAK,aAAA;AAAA,EAC5B,IAAA,CAAK,sBAAsB,IAAA,CAAK,iBAAA;AAAA,EAChC,IAAA,CAAK,sBAAsB,IAAA,CAAK,iBAAA;AAAA,EAChC,IAAA,CAAK,wBAAwB,IAAA,CAAK,mBAAA;AAAA,EAClC,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA;AAAA,EACnB,IAAA,CAAK,qBAAqB,IAAA,CAAK;AACjC,CAAA,CAAE,MAAM,OAAO,CAAA;AAEV,IAAM,WAAA,GAA6CM,iBAAA,CAAA,IAAA;AAAA,EACxD,gBAAA;AAAA,EACA;AACF,CAAA;;;AC9BO,SAAS,MAAM,MAAA,EAAkD;AACtE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACxC;ACIA,IAAM,cAAA,GAAgD;AAAA,EACpD,OAAA,EAAS,wDAAA;AAAA,EACT,OAAA,EAAS,6DAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,eAAA;AAAA,EACT,EAAA,EAAI,kBAAA;AAAA,EACJ,IAAA,EAAM;AACR,CAAA;AAOO,IAAM,MAAA,GAAeC,iBAAA,CAAA,UAAA,CAA2C,SAASC,OAAAA,CAC9E,EAAE,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,IAAA,GAAO,WAAW,IAAA,GAAO,QAAA,EAAU,GAAG,KAAA,IACxE,GAAA,EACA;AACA,EAAA,uBACER,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,uQAAA;AAAA,QACA,eAAe,OAAO,CAAA;AAAA,QACtB,YAAY,IAAI,CAAA;AAAA,QAChB;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;ACvBM,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAUS,2BAAS,QAAA,oBAAY,IAAI,MAAM,CAAA;AAE/D,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,UAAA,GAAaC,qBAAa,KAAK,CAAA;AACrC,EAAA,MAAM,gBAAgBC,mBAAA,CAAY,UAAA,EAAY,EAAE,YAAA,EAAc,GAAG,CAAA;AACjE,EAAA,MAAM,WAAA,GAAcC,kBAAUC,kBAAA,CAAW,KAAK,GAAG,EAAE,YAAA,EAAc,GAAG,CAAA;AACpE,EAAA,MAAM,OAAe,EAAC;AAEtB,EAAA,KAAA,IAAS,GAAA,GAAM,eAAe,GAAA,IAAO,WAAA,EAAa,MAAMC,eAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AAEA,EAAA,uBACEf,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAW,gBAAA;AAAA,UACX,SAAS,MAAM,QAAA,CAASe,iBAAA,CAAU,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,UAE3C,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACAf,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAuB,QAAA,EAAAC,cAAAA,CAAO,KAAA,EAAO,WAAW,CAAA,EAAE,CAAA;AAAA,sBACjED,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAW,YAAA;AAAA,UACX,SAAS,MAAM,QAAA,CAASe,iBAAA,CAAU,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,UAE1C,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEAf,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,WAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAI,EAAE,GAAA,CAAI,CAAC,0BAC/CA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,MAAA;AAAA,QAET,QAAA,EAAA;AAAA,OAAA;AAAA,MAHI;AAAA,KAKR,CAAA,EACH,CAAA;AAAA,oBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,MAAA,MAAM,UAAA,GAAa,QAAA,GAAWgB,iBAAA,CAAU,GAAA,EAAK,QAAQ,CAAA,GAAI,KAAA;AACzD,MAAA,uBACEhB,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,aAAa,SAAA,GAAY,OAAA;AAAA,UAClC,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,YACT,SAAA;AAAA,YACA,CAACiB,mBAAA,CAAY,GAAA,EAAK,KAAK,CAAA,IAAK,kCAAA;AAAA,YAC5BC,eAAA,CAAQ,GAAG,CAAA,IAAK,CAAC,UAAA,IAAc;AAAA,WACjC;AAAA,UACA,OAAA,EAAS,MAAM,QAAA,GAAW,GAAG,CAAA;AAAA,UAE5B,QAAA,EAAAjB,cAAAA,CAAO,GAAA,EAAK,GAAG;AAAA,SAAA;AAAA,QAVX,IAAI,WAAA;AAAY,OAWvB;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACtFA,IAAM,cAAA,GAAuBkB,gCAA0C,IAAI,CAAA;AAE3E,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,OAAA,GAAgBA,6BAAW,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN;AACF,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,2BAAS,KAAK,CAAA;AACpE,EAAA,MAAM,UAAA,GAAmBA,yBAA2B,IAAI,CAAA;AACxD,EAAA,MAAM,UAAA,GAAmBA,yBAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,OAAO,cAAA,IAAkB,gBAAA;AAE/B,EAAA,MAAM,OAAA,GAAgBA,iBAAA,CAAA,WAAA;AAAA,IACpB,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,YAAY,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAC9D,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,mBAAA,CAAoB,SAAS,CAAA;AAAA,MAC/B;AACA,MAAA,YAAA,GAAe,SAAS,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,YAAA,EAAc,IAAI;AAAA,GACrC;AAEA,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAsB;AAC/C,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,UAAA,CAAW,SAAS,QAAA,CAAS,MAAM,KAAK,UAAA,CAAW,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAChF,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,iBAAiB,CAAA;AACxD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,iBAAiB,CAAA;AAC3D,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,uBACEnB,cAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAA,IAC3D,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAwB,UAAS,CAAA,EAClD,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,KAAe,iBAAA,EAAkB;AAExD,EAAA,IAAI,OAAA,IAAiBmB,iBAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA;AAMd,IAAA,OAAaA,+BAAa,KAAA,EAAO;AAAA,MAC/B,GAAA,EAAK,UAAA;AAAA,MACL,eAAA,EAAiB,IAAA;AAAA,MACjB,OAAA,EAAS,CAAC,KAAA,KAA4B;AACpC,QAAA,KAAA,CAAM,KAAA,CAAM,UAAU,KAAK,CAAA;AAC3B,QAAA,OAAA,CAAQ,CAAC,OAAA,KAAY,CAAC,OAAO,CAAA;AAAA,MAC/B;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,uBACEnB,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,eAAA,EAAe,IAAA;AAAA,MACf,SAAS,MAAM,OAAA,CAAQ,CAAC,OAAA,KAAY,CAAC,OAAO,CAAA;AAAA,MAE3C;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAIG;AACD,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,iBAAA,EAAkB;AAE/C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,oIAAA;AAAA,QACA,UAAU,OAAA,IAAW,QAAA;AAAA,QACrB,UAAU,QAAA,IAAY,2BAAA;AAAA,QACtB,UAAU,KAAA,IAAS,SAAA;AAAA,QACnB;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC1IO,SAAS,uBAAA,CAAwB;AAAA,EACtC,YAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,uBACED,gBAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,8CAAA;AAAA,QAET,QAAA,EAAAC,cAAAA,CAAO,YAAA,EAAc,KAAK;AAAA;AAAA,KAC7B,EACF,CAAA;AAAA,oBACAD,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAM,QAAA;AAAA,QAEN,QAAA,kBAAAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,YAAA;AAAA,YACV,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACzBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,eAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA,GAAkB,MAAA;AAAA,EAClB,eAAA,GAAkB;AACpB,CAAA,EAA8B;AAC5B,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,eAAA;AAAA,QAER,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IACC,iBAAA;AAAA,oBACDA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QAER,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AClBO,SAAS,OAAA,CAAQ;AAAA,EACtB,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,kBAAkB,MAAM,oBAAA,CAAqB,SAAA,CAAU,YAAA,EAAc,EAAE,CAAC,CAAA;AAC9E,EAAA,MAAM,cAAc,MAAM,oBAAA,CAAqB,SAAA,CAAU,YAAA,EAAc,CAAC,CAAC,CAAA;AACzE,EAAA,MAAM,iBAAA,GAAA,CAAqB,oBAAoB,uBAAA,EAAyB;AAAA,IACtE,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACEA,cAAAA,CAAAoB,mBAAA,EAAA,EACG,QAAA,EAAA,aAAA,CAAc;AAAA,MACb,YAAA;AAAA,MACA,oBAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEpB,cAAAA,CAAAoB,mBAAA,EAAA,EACG,QAAA,EAAA,oBAAA,CAAqB;AAAA,IAGpB,eAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD,CAAA,EACH,CAAA;AAEJ;AChDA,IAAM,SAAA,GAAY,EAAE,IAAA,EAAM,MAAA,EAAO;AAE1B,SAAS,SAAA,CAId;AAAA,EACA,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,aAAA;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,EAAE,cAAA,EAAgB,UAAA,EAAY,WAAA,EAAa,UAAA,EAAY,cAAc,WAAA,EAAY,GACrF,oBAAA,CAAqB,EAAE,SAAS,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,cAAc,CAAA;AAE3F,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,MACE,wBAAA,CAAyB;AAAA,IAC3B,cAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAE,+BAAA,EAAiC,uBAAA,EAAyB,iBAAA,KAChE,4BAAA,CAA6B;AAAA,IAC3B,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,WAAA,GAAoBC,0BAAQ,MAAM;AACtC,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,CAAC,WAAA,EAAa;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa;AAAA,QACX,GAAG,WAAA,CAAY,WAAA;AAAA,QACf,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAA,EAAa,OAAA;AAAA,QACb,SAAA,EAAW,CAAA,EAAG,WAAA,CAAY,WAAA,CAAY,SAAS,CAAA,QAAA,CAAA;AAAA,QAC/C,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,MACA,UAAA,EAAY,+BAAA,CAAgC,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,MAC/D,UAAA,EAAY,uBAAA,CAAwB,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,MACvD,IAAA,EAAM,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,OAAA;AAAA,MACxC,GAAA,EAAK,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,OAAA;AAAA,MACvC,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,QAAQ,WAAA,CAAY;AAAA,KACtB;AAAA,EACF,GAAG,CAAC,+BAAA,EAAiC,uBAAA,EAAyB,IAAA,EAAM,WAAW,CAAC,CAAA;AAEhF,EAAA,uBACEtB,eAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,kDAAA,EACT,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,qBAAA,GAAwB,EACjD,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,uBAAA,GAA0B,EAAE,CAAA,CAAA;AAAA,MACzD,aAAA,EAAe,mBAAA;AAAA,MACf,WAAA,EAAa,iBAAA;AAAA,MACb,eAAA,EAAiB,iBAAA;AAAA,MAEjB,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,YAAA;AAAA,YACA,oBAAA;AAAA,YACA,eAAA;AAAA,YACA,eAAA;AAAA,YACA,aAAA;AAAA,YACA;AAAA;AAAA,SACF;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,0BAAAC,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,UAAA;AAAA,gBACA,WAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,4BACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdA,cAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBAEC,QAAA;AAAA,gBACA,OAAA;AAAA,gBACA,UAAA;AAAA,gBACA,UAAA;AAAA,gBACA,cAAc,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,EAAE,KAAK,EAAC;AAAA,gBACrD,qBAAA,EAAuB,+BAAA,CAAgC,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAAA,gBACtE,aAAA,EAAe,uBAAA,CAAwB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAAA,gBACtD,aAAA;AAAA,gBACA,iBAAA;AAAA,gBACA,iBAAA;AAAA,gBACA,mBAAA;AAAA,gBACA,IAAA,EAAM,KAAK,IAAA,KAAS,QAAA,IAAY,KAAK,UAAA,KAAe,QAAA,CAAS,KAAK,IAAA,GAAO,SAAA;AAAA,gBACzE;AAAA,eAAA;AAAA,cAbK,MAAA,CAAO,SAAS,EAAE;AAAA,aAe1B,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,QACC,8BACCA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,MAAM,WAAA,CAAY,IAAA;AAAA,cAClB,KAAK,WAAA,CAAY,GAAA;AAAA,cACjB,OAAO,WAAA,CAAY,KAAA;AAAA,cACnB,QAAQ,WAAA,CAAY;AAAA,aACtB;AAAA,YAEE,gCAAqB,wBAAA,EAA0B;AAAA,cAC/C,aAAa,WAAA,CAAY,WAAA;AAAA,cACzB,aAAA;AAAA,cACA,eAAe,MAAM,MAAA;AAAA,cACrB,qBAAqB,MAAM,MAAA;AAAA,cAC3B,uBAAuB,WAAA,CAAY,UAAA;AAAA,cACnC,4BAA4B,WAAA,CAAY,UAAA;AAAA,cACxC,IAAA;AAAA,cACA;AAAA,aACD;AAAA;AAAA,SACH,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;;;AC1KO,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\";\n\nimport type { DefaultRenderAppointmentProps } from \"./types\";\nimport type { SchedulerId } from \"@rfs-types/scheduler\";\n\nexport function defaultRenderAppointment<TAppointment, TResourceId extends SchedulerId>({\n appointment,\n isDropInvalid,\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 =\n typeof appointmentBackgroundColor === \"string\" ? appointmentBackgroundColor : undefined;\n const backgroundClassName =\n appointmentAppearance?.className ?? legacyClassName ?? \"bg-muted/40 dark:bg-muted/30\";\n const invalidStateClassName = isDropInvalid\n ? \"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\"\n : \"\";\n const visualStateClassName =\n appointment.visualState === \"ghost\"\n ? \"cursor-grab border-dashed opacity-35\"\n : appointment.visualState === \"dragging\"\n ? \"cursor-grabbing opacity-55 shadow-xl ring-1 ring-border/70\"\n : \"cursor-grab\";\n const className = `relative h-full overflow-hidden rounded-md border border-border p-2 pb-5 text-foreground ${backgroundClassName} ${invalidStateClassName} ${visualStateClassName}`;\n\n return (\n <div\n onPointerDown={onPointerDown}\n className={className}\n >\n {isDropInvalid ? (\n <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\">\n X\n </div>\n ) : null}\n <div className=\"text-xs font-semibold\">{appointment.title}</div>\n {description ? (\n <div className=\"mt-1 text-[10px] font-medium text-muted-foreground\">{description}</div>\n ) : null}\n <div\n role=\"button\"\n aria-label=\"Resize appointment\"\n onPointerDown={(event) => {\n if (appointment.visualState === \"ghost\") {\n return;\n }\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};\n","import { STEP_MIN } from \"@components/constants\";\nimport { format } from \"date-fns\";\n\nimport type { LaidOut, NameLike, TimeBlockLike } from \"@rfs-types/internal\";\nimport type { SchedulerAppointmentColorToken } from \"@rfs-types/scheduler\";\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<\n SchedulerAppointmentColorToken,\n string\n> = {\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 {\n clamp,\n dateAtMinute,\n dayISO,\n layoutOverlaps,\n minutesFromDayStart,\n} from \"./scheduler-core.utils\";\n\nimport type {\n BuildResourceMapOptions,\n NormalizeAppointmentsArgs,\n SchedulerLayoutAppointment,\n} from \"../types/internal\";\nimport type {\n BaseSchedulerResource,\n SchedulerAppointmentAppearance,\n SchedulerDragState,\n SchedulerId,\n SchedulerPresentationAppointment,\n} from \"@rfs-types/scheduler\";\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 renderKey: String(adapter.getId(appointment)),\n visualState: \"normal\" as const,\n };\n })\n .filter((appointment) => dayISO(appointment.start) === selectedISO);\n}\n\nexport function buildAppointmentMap<TAppointment, TResourceId extends SchedulerId>(\n appointments: SchedulerPresentationAppointment<TAppointment, TResourceId>[]\n) {\n return new Map(appointments.map((appointment) => [appointment.id, appointment]));\n}\n\nexport function buildPresentationAppointments<TAppointment, TResourceId extends SchedulerId>(\n appointments: SchedulerPresentationAppointment<TAppointment, TResourceId>[],\n drag: SchedulerDragState<TResourceId>,\n selectedDate: Date,\n dayStartAbs: number\n): SchedulerPresentationAppointment<TAppointment, TResourceId>[] {\n if (drag.kind === \"none\") {\n return appointments;\n }\n\n if (drag.kind === \"move\") {\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 visualState: \"dragging\" as const,\n };\n });\n}\n\nexport function buildLaidOutByResource<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId,\n>(\n resources: TResource[],\n appointments: SchedulerPresentationAppointment<TAppointment, TResourceId>[]\n) {\n const appointmentsByResource = new Map<\n TResourceId,\n SchedulerPresentationAppointment<TAppointment, TResourceId>[]\n >();\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, buildLaidOutAppointments(appointmentsByResource.get(resource.id) ?? []));\n }\n return result;\n}\n\nexport function buildLaidOutAppointments<TAppointment, TResourceId extends SchedulerId>(\n appointments: SchedulerPresentationAppointment<TAppointment, TResourceId>[]\n) {\n return layoutOverlaps(\n appointments.map((appointment) => ({\n ...appointment,\n appointmentId: appointment.id,\n id: appointment.renderKey,\n }))\n ).map(({ appointmentId, ...appointment }) => ({\n ...appointment,\n id: appointmentId,\n }));\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:\n | ((resource: TResource) => SchedulerAppointmentAppearance | undefined)\n | 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","\nimport { BOTTOM_PAD, GUTTER_W, PX_PER_MIN, RESOURCE_MIN_W, TOP_PAD } from \"@components/constants\";\nimport { dayISO, parseHHMM } from \"@utils/scheduler-core.utils\";\nimport { buildAppointmentMap, normalizeAppointments } from \"@utils/scheduler-data.utils\";\nimport * as React from \"react\";\n\nimport type { SchedulerBaseData, UseSchedulerBaseDataArgs } from \"./types\";\nimport type { BaseSchedulerResource, SchedulerId } from \"@rfs-types/scheduler\";\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<\n TAppointment,\n TResourceId\n> {\n const dayStartAbs = React.useMemo(() => parseHHMM(dayStart), [dayStart]);\n const dayEndAbs = React.useMemo(() => parseHHMM(dayEnd), [dayEnd]);\n const dayMinutes = React.useMemo(\n () => Math.max(0, dayEndAbs - dayStartAbs),\n [dayEndAbs, dayStartAbs]\n );\n const gridHeight = React.useMemo(\n () => TOP_PAD + dayMinutes * PX_PER_MIN + BOTTOM_PAD,\n [dayMinutes]\n );\n const gridMinWidth = React.useMemo(\n () => GUTTER_W + Math.max(resources.length, 1) * RESOURCE_MIN_W,\n [resources.length]\n );\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 { MIN_EVENT_MIN } from \"@components/constants\";\nimport { clamp, snap } from \"@utils/scheduler-core.utils\";\n\nimport type { SchedulerDragState, SchedulerId, SchedulerPresentationAppointment } from \"@rfs-types/scheduler\";\nimport type * as React from \"react\";\n\nexport const DRAG_START_THRESHOLD_PX = 4;\n\nexport type MovePreview<TAppointment, TResourceId extends SchedulerId> = {\n appointment: SchedulerPresentationAppointment<TAppointment, TResourceId>;\n clientX: number;\n clientY: number;\n width: number;\n height: number;\n offsetX: number;\n offsetY: number;\n};\n\nexport type PendingDrag<TAppointment, TResourceId extends SchedulerId> = {\n drag: Exclude<SchedulerDragState<TResourceId>, { kind: \"none\" }>;\n appointment: SchedulerPresentationAppointment<TAppointment, TResourceId>;\n startClientX: number;\n startClientY: number;\n width: number;\n height: number;\n offsetX: number;\n offsetY: number;\n};\n\nexport type PointerSnapshot = {\n clientX: number;\n clientY: number;\n pointerId: number;\n};\n\nexport const updateMovePreviewPosition = <TAppointment, TResourceId extends SchedulerId>(\n setMovePreview: React.Dispatch<React.SetStateAction<MovePreview<TAppointment, TResourceId> | null>>,\n pointer: PointerSnapshot\n) => {\n setMovePreview((current) =>\n current\n ? {\n ...current,\n clientX: pointer.clientX,\n clientY: pointer.clientY,\n }\n : current\n );\n};\n\nexport const startPendingDragIfThresholdPassed = <TAppointment, TResourceId extends SchedulerId>(\n args: {\n pointer: PointerSnapshot;\n pendingDragRef: { current: PendingDrag<TAppointment, TResourceId> | null };\n setDrag: React.Dispatch<React.SetStateAction<SchedulerDragState<TResourceId>>>;\n setMovePreview: React.Dispatch<React.SetStateAction<MovePreview<TAppointment, TResourceId> | null>>;\n dragRef: { current: SchedulerDragState<TResourceId> };\n suppressClickRef: { current: boolean };\n }\n) => {\n const { dragRef, pendingDragRef, pointer, setDrag, setMovePreview, suppressClickRef } = args;\n const pending = pendingDragRef.current;\n if (!pending || pending.drag.pointerId !== pointer.pointerId) {\n return;\n }\n\n const deltaX = pointer.clientX - pending.startClientX;\n const deltaY = pointer.clientY - pending.startClientY;\n if (Math.hypot(deltaX, deltaY) < DRAG_START_THRESHOLD_PX) {\n return;\n }\n\n suppressClickRef.current = true;\n dragRef.current = pending.drag;\n setDrag(pending.drag);\n if (pending.drag.kind === \"move\") {\n setMovePreview({\n appointment: pending.appointment,\n clientX: pointer.clientX,\n clientY: pointer.clientY,\n width: pending.width,\n height: pending.height,\n offsetX: pending.offsetX,\n offsetY: pending.offsetY,\n });\n }\n pendingDragRef.current = null;\n};\n\nexport const buildNextMoveDrag = <TResourceId extends SchedulerId>(\n drag: Extract<SchedulerDragState<TResourceId>, { kind: \"move\" }>,\n pointer: PointerSnapshot,\n dayMinutes: number,\n pointerToResourceId: (clientX: number, fallbackResourceId: TResourceId) => TResourceId,\n pointerToMin: (resourceId: TResourceId, clientY: number) => number\n) => {\n const nextResourceId = pointerToResourceId(pointer.clientX, drag.resourceId);\n const pointerMin = pointerToMin(nextResourceId, pointer.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 (\n nextStartMin === drag.startMin &&\n nextEndMin === drag.endMin &&\n nextResourceId === drag.resourceId\n ) {\n return null;\n }\n\n return {\n ...drag,\n resourceId: nextResourceId,\n startMin: nextStartMin,\n endMin: nextEndMin,\n };\n};\n\nexport const buildNextResizeDrag = <TResourceId extends SchedulerId>(\n drag: Extract<SchedulerDragState<TResourceId>, { kind: \"resize\" }>,\n pointer: PointerSnapshot,\n dayMinutes: number,\n pointerToMin: (resourceId: TResourceId, clientY: number) => number\n) => {\n const pointerMin = pointerToMin(drag.resourceId, pointer.clientY);\n const nextEndMin = clamp(snap(pointerMin), drag.startMin + MIN_EVENT_MIN, dayMinutes);\n if (nextEndMin === drag.endMin) {\n return null;\n }\n\n return {\n ...drag,\n endMin: nextEndMin,\n };\n};\n\nexport const processPointerFrame = <TAppointment, TResourceId extends SchedulerId>(\n args: {\n dayMinutes: number;\n dragRef: { current: SchedulerDragState<TResourceId> };\n latestPointerRef: { current: PointerSnapshot | null };\n pendingDragRef: { current: PendingDrag<TAppointment, TResourceId> | null };\n pointerToMin: (resourceId: TResourceId, clientY: number) => number;\n pointerToResourceId: (clientX: number, fallbackResourceId: TResourceId) => TResourceId;\n setDrag: React.Dispatch<React.SetStateAction<SchedulerDragState<TResourceId>>>;\n setMovePreview: React.Dispatch<React.SetStateAction<MovePreview<TAppointment, TResourceId> | null>>;\n suppressClickRef: { current: boolean };\n }\n) => {\n const {\n dayMinutes,\n dragRef,\n latestPointerRef,\n pendingDragRef,\n pointerToMin,\n pointerToResourceId,\n setDrag,\n setMovePreview,\n suppressClickRef,\n } = args;\n const pointer = latestPointerRef.current;\n if (!pointer) {\n return;\n }\n\n const currentDrag = dragRef.current;\n\n if (currentDrag.kind === \"none\" && pendingDragRef.current) {\n startPendingDragIfThresholdPassed({\n pointer,\n pendingDragRef,\n setDrag,\n setMovePreview,\n dragRef,\n suppressClickRef,\n });\n return;\n }\n\n if (currentDrag.kind === \"none\") {\n return;\n }\n\n if (currentDrag.kind === \"move\") {\n updateMovePreviewPosition(setMovePreview, pointer);\n const nextDrag = buildNextMoveDrag(\n currentDrag,\n pointer,\n dayMinutes,\n pointerToResourceId,\n pointerToMin\n );\n if (nextDrag) {\n suppressClickRef.current = true;\n dragRef.current = nextDrag;\n setDrag(nextDrag);\n }\n return;\n }\n\n const nextDrag = buildNextResizeDrag(currentDrag, pointer, dayMinutes, pointerToMin);\n if (nextDrag) {\n suppressClickRef.current = true;\n dragRef.current = nextDrag;\n setDrag(nextDrag);\n }\n};\n\nexport const finishDrag = <TAppointment, TResourceId extends SchedulerId>(\n args: {\n dragRef: { current: SchedulerDragState<TResourceId> };\n frameRef: { current: number | null };\n latestPointerRef: { current: PointerSnapshot | null };\n pendingDragRef: { current: PendingDrag<TAppointment, TResourceId> | null };\n persistDrag: (state: Exclude<SchedulerDragState<TResourceId>, { kind: \"none\" }>) => Promise<void>;\n setDrag: React.Dispatch<React.SetStateAction<SchedulerDragState<TResourceId>>>;\n setMovePreview: React.Dispatch<React.SetStateAction<MovePreview<TAppointment, TResourceId> | null>>;\n suppressClickRef: { current: boolean };\n }\n) => {\n const {\n dragRef,\n frameRef,\n latestPointerRef,\n pendingDragRef,\n persistDrag,\n setDrag,\n setMovePreview,\n suppressClickRef,\n } = args;\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n latestPointerRef.current = null;\n pendingDragRef.current = null;\n setMovePreview(null);\n const current = dragRef.current;\n if (current.kind === \"none\") {\n return;\n }\n\n setDrag({ kind: \"none\" });\n dragRef.current = { kind: \"none\" };\n if (suppressClickRef.current) {\n void persistDrag(current);\n }\n};\n","\nimport { MIN_EVENT_MIN, PX_PER_MIN, TOP_PAD } from \"@components/constants\";\nimport { clamp, dateAtMinute, overlaps, snap } from \"@utils/scheduler-core.utils\";\nimport * as React from \"react\";\n\nimport {\n finishDrag,\n type MovePreview,\n type PendingDrag,\n type PointerSnapshot,\n processPointerFrame,\n} from \"./useSchedulerInteractions.helpers\";\n\nimport type { SchedulerInteractions, UseSchedulerInteractionsArgs } from \"./types\";\nimport type {\n BaseSchedulerResource,\n SchedulerDragState,\n SchedulerId,\n SchedulerPresentationAppointment,\n} from \"@rfs-types/scheduler\";\n\n// eslint-disable-next-line max-lines-per-function\nexport const 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<\n TAppointment,\n TResourceId\n> => {\n const [drag, setDrag] = React.useState<SchedulerDragState<TResourceId>>({ kind: \"none\" });\n const [movePreview, setMovePreview] = React.useState<MovePreview<TAppointment, TResourceId> | null>(\n null\n );\n const colRefs = React.useRef<Record<string, HTMLDivElement | null>>({});\n const suppressClickRef = React.useRef(false);\n const dragRef = React.useRef<SchedulerDragState<TResourceId>>({ kind: \"none\" });\n const pendingDragRef = React.useRef<PendingDrag<TAppointment, TResourceId> | null>(null);\n const latestPointerRef = React.useRef<PointerSnapshot | null>(null);\n const frameRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n dragRef.current = drag;\n }, [drag]);\n\n React.useEffect(() => {\n return () => {\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n }\n };\n }, []);\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(\n (appointment) => appointment.resourceId === resourceId && appointment.id !== appointmentId\n );\n return events.some((appointment) =>\n overlaps(appointment, { id: appointmentId, startMin, endMin })\n );\n },\n [renderAppts]\n );\n\n const isDropInvalid = React.useMemo(() => {\n if (drag.kind === \"none\") {\n return false;\n }\n\n return hasOverlap(drag.appointmentId, drag.resourceId, drag.startMin, drag.endMin);\n }, [drag, hasOverlap]);\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 [\n appointmentMap,\n dayStartAbs,\n hasOverlap,\n onAppointmentChange,\n onPersistMoveResize,\n selectedDate,\n ]\n );\n\n const onApptPointerDown = React.useCallback(\n (event: React.PointerEvent, appointment: SchedulerPresentationAppointment<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n suppressClickRef.current = false;\n const rect = (event.currentTarget as HTMLDivElement).getBoundingClientRect();\n const pointerMin = pointerToMin(appointment.resourceId, event.clientY);\n pendingDragRef.current = {\n drag: {\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 appointment,\n startClientX: event.clientX,\n startClientY: event.clientY,\n width: rect.width,\n height: rect.height,\n offsetX: event.clientX - rect.left,\n offsetY: event.clientY - rect.top,\n };\n },\n [pointerToMin]\n );\n\n const onResizePointerDown = React.useCallback(\n (event: React.PointerEvent, appointment: SchedulerPresentationAppointment<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n suppressClickRef.current = false;\n pendingDragRef.current = {\n drag: {\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 appointment,\n startClientX: event.clientX,\n startClientY: event.clientY,\n width: 0,\n height: 0,\n offsetX: 0,\n offsetY: 0,\n };\n },\n []\n );\n\n const onGlobalPointerMove = React.useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n latestPointerRef.current = {\n clientX: event.clientX,\n clientY: event.clientY,\n pointerId: event.pointerId,\n };\n\n if (frameRef.current !== null) {\n return;\n }\n\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = null;\n processPointerFrame({\n dayMinutes,\n dragRef,\n latestPointerRef,\n pendingDragRef,\n pointerToMin,\n pointerToResourceId,\n setDrag,\n setMovePreview,\n suppressClickRef,\n });\n });\n },\n [dayMinutes, pointerToMin, pointerToResourceId]\n );\n\n const onGlobalPointerUp = React.useCallback(() => {\n finishDrag({\n dragRef,\n frameRef,\n latestPointerRef,\n pendingDragRef,\n persistDrag,\n setDrag,\n setMovePreview,\n suppressClickRef,\n });\n }, [persistDrag]);\n\n return {\n colRefs,\n drag,\n isDropInvalid,\n movePreview,\n onApptPointerDown,\n onGlobalPointerMove,\n onGlobalPointerUp,\n onResizePointerDown,\n suppressClickRef,\n };\n};\n","\nimport { DEFAULT_APPOINTMENT_COLOR_TOKEN_CLASS_MAP } from \"@utils/scheduler-core.utils\";\nimport {\n buildAppointmentAppearanceByResource,\n buildLaidOutAppointments,\n buildLaidOutByResource,\n buildPresentationAppointments,\n buildResourceMap,\n} from \"@utils/scheduler-data.utils\";\nimport * as React from \"react\";\n\nimport type { SchedulerPresentationData, UseSchedulerPresentationDataArgs } from \"./types\";\nimport type { BaseSchedulerResource, SchedulerId } from \"@rfs-types/scheduler\";\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<\n TAppointment,\n TResource,\n TResourceId\n>): SchedulerPresentationData<TAppointment, TResourceId> {\n const effectiveAppts = React.useMemo(() => {\n return buildPresentationAppointments(renderAppts, drag, selectedDate, dayStartAbs);\n }, [dayStartAbs, drag, renderAppts, selectedDate]);\n\n const baseLaidOutByResource = React.useMemo(() => {\n return buildLaidOutByResource(resources, renderAppts);\n }, [renderAppts, resources]);\n\n const laidOutByResource = React.useMemo(() => {\n if (drag.kind !== \"resize\") {\n return baseLaidOutByResource;\n }\n\n const next = new Map(baseLaidOutByResource);\n const nextAppointmentsForResource = effectiveAppts.filter(\n (appointment) => appointment.resourceId === drag.resourceId\n );\n next.set(drag.resourceId, buildLaidOutAppointments(nextAppointmentsForResource));\n return next;\n }, [baseLaidOutByResource, drag, effectiveAppts]);\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 { GUTTER_W, PX_PER_MIN, TOP_PAD } from \"@components/constants\";\nimport * as React from \"react\";\n\ntype SchedulerGutterProps = {\n dayMinutes: number;\n dayStartAbs: number;\n gridHeight: number;\n};\n\nexport function Gutter({ dayMinutes, dayStartAbs, gridHeight }: SchedulerGutterProps) {\n return (\n <div\n className=\"rfs-times border-border bg-card\"\n style={{ width: GUTTER_W, height: gridHeight }}\n >\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 );\n}\n","import * as React from \"react\";\n\nimport type { DefaultRenderResourceHeaderProps } from \"./types\";\nimport type { BaseSchedulerResource, SchedulerId } from \"@rfs-types/scheduler\";\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","\nimport { GUTTER_W, RESOURCE_MIN_W } from \"@components/constants\";\nimport { defaultRenderResourceHeader } from \"@components/defaultRenderResourceHeader\";\nimport { fullName, isNameLike } from \"@utils/scheduler-core.utils\";\nimport * as React from \"react\";\n\nimport type { BaseSchedulerResource, SchedulerId } from \"@rfs-types/scheduler\";\n\ntype SchedulerHeaderProps<\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId,\n> = {\n resources: TResource[];\n renderResourceHeader?: (resource: TResource) => React.ReactNode;\n};\n\nexport function Header<\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId,\n>({ resources, renderResourceHeader }: SchedulerHeaderProps<TResource, TResourceId>) {\n return (\n <div className=\"rfs-header border-border bg-card\">\n <div\n className=\"rfs-gutter border-border\"\n style={{ width: GUTTER_W }}\n />\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 ?? ((r) => defaultRenderResourceHeader({ resource: r })))(\n resource\n )}\n {isNameLike(resource) ? (\n <div className=\"rfs-resource-subtitle text-muted-foreground\">{fullName(resource)}</div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { MIN_EVENT_MIN, PX_PER_MIN, RESOURCE_MIN_W, STEP_MIN, TOP_PAD } from \"../../constants\";\nimport { defaultRenderAppointment } from \"../../defaultRenderAppointment\";\n\nimport type { SchedulerResourceColumnProps } from \"../../../types/internal\";\nimport type { SchedulerId } from \"../../../types/scheduler\";\n\nexport const ResourceColInner = <TAppointment, TResourceId extends SchedulerId>({\n resource,\n colRefs,\n gridHeight,\n dayMinutes,\n appointments,\n appointmentAppearance,\n appointmentBg,\n isDropInvalid,\n renderAppointment,\n onApptPointerDown,\n onResizePointerDown,\n drag,\n suppressClickRef,\n}: SchedulerResourceColumnProps<TAppointment, TResourceId>) => {\n return (\n <div\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-${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-${i}`}\n className=\"rfs-slot-line border-border/50\"\n style={{ top: TOP_PAD + i * STEP_MIN * PX_PER_MIN }}\n />\n ))}\n {appointments.map((appointment) => {\n const laneWidthPct = 100 / appointment.lanes;\n const top = TOP_PAD + appointment.startMin * PX_PER_MIN;\n const height = Math.max(\n MIN_EVENT_MIN * PX_PER_MIN,\n (appointment.endMin - appointment.startMin) * PX_PER_MIN\n );\n return (\n <div\n key={appointment.renderKey}\n className={`rfs-card-slot ${\n appointment.visualState === \"ghost\" ? \"rfs-card-slot--ghost\" : \"\"\n } ${appointment.visualState === \"dragging\" ? \"rfs-card-slot--dragging\" : \"\"}`}\n style={{\n top,\n left: `${laneWidthPct * appointment.lane}%`,\n width: `${laneWidthPct}%`,\n height,\n }}\n >\n {(renderAppointment ?? defaultRenderAppointment)({\n appointment,\n isDropInvalid:\n isDropInvalid &&\n drag.kind === \"resize\" &&\n appointment.id === drag.appointmentId,\n onPointerDown: (event) => onApptPointerDown(event, appointment),\n onResizePointerDown: (event) => onResizePointerDown(event, appointment),\n appointmentAppearance,\n appointmentBackgroundColor: appointmentBg,\n drag,\n suppressClickRef,\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\n\nimport { ResourceColInner } from \"./ResourceColInner\";\n\nimport type { SchedulerResourceColumnProps } from \"../../../types/internal\";\nimport type { SchedulerId } from \"../../../types/scheduler\";\n\nconst areResourceColsEqual = <TAppointment, TResourceId extends SchedulerId>(\n prev: Readonly<SchedulerResourceColumnProps<TAppointment, TResourceId>>,\n next: Readonly<SchedulerResourceColumnProps<TAppointment, TResourceId>>\n) =>\n [\n prev.resource === next.resource,\n prev.colRefs === next.colRefs,\n prev.gridHeight === next.gridHeight,\n prev.dayMinutes === next.dayMinutes,\n prev.appointments === next.appointments,\n prev.appointmentAppearance === next.appointmentAppearance,\n prev.appointmentBg === next.appointmentBg,\n prev.isDropInvalid === next.isDropInvalid,\n prev.renderAppointment === next.renderAppointment,\n prev.onApptPointerDown === next.onApptPointerDown,\n prev.onResizePointerDown === next.onResizePointerDown,\n prev.drag === next.drag,\n prev.suppressClickRef === next.suppressClickRef,\n ].every(Boolean);\n\nexport const ResourceCol: typeof ResourceColInner = React.memo(\n ResourceColInner,\n areResourceColsEqual\n) as typeof ResourceColInner;\n","export function cn(...inputs: Array<string | false | null | undefined>) {\n return inputs.filter(Boolean).join(\" \");\n}\n","import { cn } from \"@lib/cn\";\nimport * as React from \"react\";\n\ntype ButtonVariant = \"default\" | \"outline\" | \"ghost\";\ntype ButtonSize = \"default\" | \"sm\" | \"icon\";\n\nconst variantClasses: Record<ButtonVariant, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n outline: \"border border-border bg-card text-foreground hover:bg-muted\",\n ghost: \"text-foreground hover:bg-muted\",\n};\n\nconst sizeClasses: Record<ButtonSize, string> = {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 px-3 text-xs\",\n icon: \"h-8 w-8\",\n};\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { className, variant = \"default\", size = \"default\", type = \"button\", ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"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\",\n variantClasses[variant],\n sizeClasses[size],\n className\n )}\n {...props}\n />\n );\n});\n","import { cn } from \"@lib/cn\";\nimport {\n addDays,\n addMonths,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isToday,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport * as React from \"react\";\n\nimport { Button } from \"./button\";\n\nexport function Calendar({\n selected,\n onSelect,\n}: {\n selected?: Date;\n onSelect?: (date: Date) => void;\n}) {\n const [month, setMonth] = React.useState(selected ?? new Date());\n\n React.useEffect(() => {\n if (selected) {\n setMonth(selected);\n }\n }, [selected]);\n\n const monthStart = startOfMonth(month);\n const calendarStart = startOfWeek(monthStart, { weekStartsOn: 1 });\n const calendarEnd = endOfWeek(endOfMonth(month), { weekStartsOn: 1 });\n const days: Date[] = [];\n\n for (let day = calendarStart; day <= calendarEnd; day = addDays(day, 1)) {\n days.push(day);\n }\n\n return (\n <div className=\"w-72 rounded-md bg-popover\">\n <div className=\"mb-2 flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Previous month\"\n onClick={() => setMonth(addMonths(month, -1))}\n >\n {\"<\"}\n </Button>\n <div className=\"text-sm font-medium\">{format(month, \"MMMM yyyy\")}</div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Next month\"\n onClick={() => setMonth(addMonths(month, 1))}\n >\n {\">\"}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-7 gap-1 text-center text-xs text-muted-foreground\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((label) => (\n <div\n key={label}\n className=\"py-1\"\n >\n {label}\n </div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((day) => {\n const isSelected = selected ? isSameDay(day, selected) : false;\n return (\n <Button\n key={day.toISOString()}\n variant={isSelected ? \"default\" : \"ghost\"}\n size=\"icon\"\n className={cn(\n \"text-xs\",\n !isSameMonth(day, month) && \"text-muted-foreground opacity-60\",\n isToday(day) && !isSelected && \"border border-border\"\n )}\n onClick={() => onSelect?.(day)}\n >\n {format(day, \"d\")}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { cn } from \"@lib/cn\";\nimport * as React from \"react\";\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null);\n\nfunction usePopoverContext() {\n const context = React.useContext(PopoverContext);\n if (!context) {\n throw new Error(\"Popover components must be used within Popover.\");\n }\n\n return context;\n}\n\nexport function Popover({\n children,\n open: controlledOpen,\n onOpenChange,\n}: {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const open = controlledOpen ?? uncontrolledOpen;\n\n const setOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (value) => {\n const nextValue = typeof value === \"function\" ? value(open) : value;\n if (controlledOpen === undefined) {\n setUncontrolledOpen(nextValue);\n }\n onOpenChange?.(nextValue);\n },\n [controlledOpen, onOpenChange, open]\n );\n\n React.useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.current?.contains(target) || contentRef.current?.contains(target)) {\n return;\n }\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open, setOpen]);\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef, contentRef }}>\n <div className=\"relative inline-flex\">{children}</div>\n </PopoverContext.Provider>\n );\n}\n\nexport function PopoverTrigger({\n children,\n asChild = false,\n}: {\n children: React.ReactNode;\n asChild?: boolean;\n}) {\n const { open, setOpen, triggerRef } = usePopoverContext();\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n ref?: React.Ref<HTMLElement>;\n \"aria-expanded\"?: boolean;\n }>;\n\n return React.cloneElement(child, {\n ref: triggerRef,\n \"aria-expanded\": open,\n onClick: (event: React.MouseEvent) => {\n child.props.onClick?.(event);\n setOpen((current) => !current);\n },\n });\n }\n\n return (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n >\n {children}\n </button>\n );\n}\n\nexport function PopoverContent({\n children,\n className,\n align = \"start\",\n}: {\n children: React.ReactNode;\n className?: string;\n align?: \"start\" | \"center\" | \"end\";\n}) {\n const { open, contentRef } = usePopoverContext();\n\n if (!open) {\n return null;\n }\n\n return (\n <div\n ref={contentRef}\n className={cn(\n \"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\",\n align === \"start\" && \"left-0\",\n align === \"center\" && \"left-1/2 -translate-x-1/2\",\n align === \"end\" && \"right-0\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","\nimport { Button } from \"@components/ui/button\";\nimport { Calendar } from \"@components/ui/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@components/ui/popover\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\n\nimport type { DefaultRenderDatePickerProps } from \"./types\";\n\nexport function defaultRenderDatePicker({\n selectedDate,\n onSelectedDateChange,\n}: DefaultRenderDatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-40 justify-start text-left font-normal\"\n >\n {format(selectedDate, \"PPP\")}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto p-2\"\n align=\"center\"\n >\n <Calendar\n selected={selectedDate}\n onSelect={onSelectedDateChange}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { Button } from \"@components/ui/button\";\nimport * as React from \"react\";\n\nimport type { SchedulerToolbarRenderArgs } from \"@rfs-types\";\n\ntype DefaultRenderToolbarProps = SchedulerToolbarRenderArgs & {\n prevButtonLabel?: React.ReactNode;\n nextButtonLabel?: React.ReactNode;\n};\n\nexport function defaultRenderToolbar({\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\",\n}: DefaultRenderToolbarProps) {\n return (\n <div className=\"rfs-toolbar\">\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-1 shadow-xs\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToPreviousDay}\n >\n {prevButtonLabel}\n </Button>\n {defaultDatePicker}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToNextDay}\n >\n {nextButtonLabel}\n </Button>\n </div>\n </div>\n );\n}\n","\nimport { defaultRenderDatePicker } from \"@components/defaultRenderDatePicker\";\nimport { defaultRenderToolbar } from \"@components/defaultRenderToolbar\";\nimport { shiftDays } from \"@utils/scheduler-core.utils\";\nimport * as React from \"react\";\n\nimport type { SchedulerToolbarRenderArgs } from \"@rfs-types\";\n\ntype SchedulerToolbarProps = {\n selectedDate: Date;\n onSelectedDateChange: (date: Date) => void;\n prevButtonLabel: React.ReactNode;\n nextButtonLabel: React.ReactNode;\n renderToolbar?: (args: SchedulerToolbarRenderArgs) => React.ReactNode;\n renderDatePicker?: (args: {\n selectedDate: Date;\n onSelectedDateChange: (date: Date) => void;\n }) => React.ReactNode;\n};\n\nexport function Toolbar({\n selectedDate,\n onSelectedDateChange,\n prevButtonLabel,\n nextButtonLabel,\n renderToolbar,\n renderDatePicker,\n}: SchedulerToolbarProps) {\n const goToPreviousDay = () => onSelectedDateChange(shiftDays(selectedDate, -1));\n const goToNextDay = () => onSelectedDateChange(shiftDays(selectedDate, 1));\n const defaultDatePicker = (renderDatePicker ?? defaultRenderDatePicker)({\n selectedDate,\n onSelectedDateChange,\n });\n\n if (renderToolbar) {\n return (\n <>\n {renderToolbar({\n selectedDate,\n onSelectedDateChange,\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker,\n })}\n </>\n );\n }\n\n return (\n <>\n {defaultRenderToolbar({\n selectedDate,\n onSelectedDateChange,\n goToPreviousDay,\n goToNextDay,\n defaultDatePicker,\n prevButtonLabel,\n nextButtonLabel,\n })}\n </>\n );\n}\n","\nimport { defaultRenderAppointment } from \"@components/defaultRenderAppointment\";\nimport { useSchedulerBaseData } from \"@hooks/useSchedulerBaseData\";\nimport { useSchedulerInteractions } from \"@hooks/useSchedulerInteractions\";\nimport { useSchedulerPresentationData } from \"@hooks/useSchedulerPresentationData\";\nimport * as React from \"react\";\n\nimport { Gutter } from \"./parts/Gutter\";\nimport { Header } from \"./parts/Header\";\nimport { ResourceCol } from \"./parts/ResourceCol\";\nimport { Toolbar } from \"./parts/Toolbar\";\n\nimport type { BaseSchedulerResource, SchedulerId, SchedulerProps } from \"@rfs-types\";\n\nconst IDLE_DRAG = { kind: \"none\" } as const;\n\nexport function Scheduler<\n TAppointment,\n TResource extends BaseSchedulerResource<TResourceId>,\n TResourceId extends SchedulerId,\n>({\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 renderToolbar,\n renderDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\",\n dayStart = \"09:00\",\n dayEnd = \"18:00\",\n}: SchedulerProps<TAppointment, TResource, TResourceId>) {\n const { appointmentMap, dayMinutes, dayStartAbs, gridHeight, gridMinWidth, renderAppts } =\n useSchedulerBaseData({ adapter, appointments, dayEnd, dayStart, resources, selectedDate });\n\n const {\n colRefs,\n drag,\n isDropInvalid,\n movePreview,\n onApptPointerDown,\n onGlobalPointerMove,\n onGlobalPointerUp,\n onResizePointerDown,\n suppressClickRef,\n } = useSchedulerInteractions({\n appointmentMap,\n dayMinutes,\n dayStartAbs,\n onAppointmentChange,\n onPersistMoveResize,\n renderAppts,\n resources,\n selectedDate,\n });\n\n const { appointmentAppearanceByResource, appointmentBgByResource, 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 moveOverlay = React.useMemo(() => {\n if (drag.kind !== \"move\" || !movePreview) {\n return null;\n }\n\n return {\n appointment: {\n ...movePreview.appointment,\n resourceId: drag.resourceId,\n startMin: drag.startMin,\n endMin: drag.endMin,\n visualState: \"ghost\" as const,\n renderKey: `${movePreview.appointment.renderKey}-overlay`,\n lane: 0,\n lanes: 1,\n },\n appearance: appointmentAppearanceByResource.get(drag.resourceId),\n background: appointmentBgByResource.get(drag.resourceId),\n left: movePreview.clientX - movePreview.offsetX,\n top: movePreview.clientY - movePreview.offsetY,\n width: movePreview.width,\n height: movePreview.height,\n };\n }, [appointmentAppearanceByResource, appointmentBgByResource, drag, movePreview]);\n\n return (\n <section\n className={`rfs-root rounded-lg bg-background text-foreground ${\n drag.kind === \"move\" ? \"rfs-root--drag-move\" : \"\"\n } ${drag.kind === \"resize\" ? \"rfs-root--drag-resize\" : \"\"}`}\n onPointerMove={onGlobalPointerMove}\n onPointerUp={onGlobalPointerUp}\n onPointerCancel={onGlobalPointerUp}\n >\n <Toolbar\n selectedDate={selectedDate}\n onSelectedDateChange={onSelectedDateChange}\n prevButtonLabel={prevButtonLabel}\n nextButtonLabel={nextButtonLabel}\n renderToolbar={renderToolbar}\n renderDatePicker={renderDatePicker}\n />\n\n <div className=\"rfs-shell border-border bg-card\">\n <div style={{ minWidth: gridMinWidth }}>\n <Header\n resources={resources}\n renderResourceHeader={renderResourceHeader}\n />\n <div className=\"rfs-body\">\n <Gutter\n dayMinutes={dayMinutes}\n dayStartAbs={dayStartAbs}\n gridHeight={gridHeight}\n />\n <div className=\"rfs-grid\">\n {resources.map((resource) => (\n <ResourceCol\n key={String(resource.id)}\n resource={resource}\n colRefs={colRefs}\n gridHeight={gridHeight}\n dayMinutes={dayMinutes}\n appointments={laidOutByResource.get(resource.id) ?? []}\n appointmentAppearance={appointmentAppearanceByResource.get(resource.id)}\n appointmentBg={appointmentBgByResource.get(resource.id)}\n isDropInvalid={isDropInvalid}\n renderAppointment={renderAppointment}\n onApptPointerDown={onApptPointerDown}\n onResizePointerDown={onResizePointerDown}\n drag={drag.kind === \"resize\" && drag.resourceId === resource.id ? drag : IDLE_DRAG}\n suppressClickRef={suppressClickRef}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n {moveOverlay ? (\n <div\n className=\"rfs-drag-overlay\"\n style={{\n left: moveOverlay.left,\n top: moveOverlay.top,\n width: moveOverlay.width,\n height: moveOverlay.height,\n }}\n >\n {(renderAppointment ?? defaultRenderAppointment)({\n appointment: moveOverlay.appointment,\n isDropInvalid,\n onPointerDown: () => undefined,\n onResizePointerDown: () => undefined,\n appointmentAppearance: moveOverlay.appearance,\n appointmentBackgroundColor: moveOverlay.background,\n drag,\n suppressClickRef,\n })}\n </div>\n ) : null}\n </section>\n );\n}\n","import type { SchedulerAppointmentChangeArgs, SchedulerId } from \"@rfs-types\";\n\nexport type ApplySchedulerAppointmentChangeOptions<\n TAppointment,\n TResourceId extends SchedulerId,\n> = {\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
|
@@ -23,6 +23,11 @@ type SchedulerEvent<TAppointment, TResourceId extends SchedulerId> = {
|
|
|
23
23
|
endMin: number;
|
|
24
24
|
title: string;
|
|
25
25
|
};
|
|
26
|
+
type SchedulerAppointmentVisualState = "normal" | "ghost" | "dragging";
|
|
27
|
+
type SchedulerPresentationAppointment<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId> & {
|
|
28
|
+
renderKey: string;
|
|
29
|
+
visualState: SchedulerAppointmentVisualState;
|
|
30
|
+
};
|
|
26
31
|
type SchedulerDragState<TResourceId extends SchedulerId> = {
|
|
27
32
|
kind: "none";
|
|
28
33
|
} | {
|
|
@@ -84,10 +89,11 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
|
|
|
84
89
|
onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
|
|
85
90
|
renderResourceHeader?: (resource: TResource) => React.ReactNode;
|
|
86
91
|
renderAppointment?: (args: {
|
|
87
|
-
appointment:
|
|
92
|
+
appointment: SchedulerPresentationAppointment<TAppointment, TResourceId> & {
|
|
88
93
|
lane: number;
|
|
89
94
|
lanes: number;
|
|
90
95
|
};
|
|
96
|
+
isDropInvalid: boolean;
|
|
91
97
|
onPointerDown: (e: React.PointerEvent) => void;
|
|
92
98
|
onResizePointerDown: (e: React.PointerEvent) => void;
|
|
93
99
|
appointmentAppearance?: SchedulerAppointmentAppearance;
|
|
@@ -111,7 +117,7 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
|
|
|
111
117
|
dayEnd?: string;
|
|
112
118
|
};
|
|
113
119
|
|
|
114
|
-
declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
|
|
120
|
+
declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
|
|
115
121
|
|
|
116
122
|
type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
|
|
117
123
|
getId: (appointment: TAppointment) => SchedulerId;
|
|
@@ -121,4 +127,4 @@ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends Sc
|
|
|
121
127
|
};
|
|
122
128
|
declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
|
|
123
129
|
|
|
124
|
-
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, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
|
|
130
|
+
export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,6 +23,11 @@ type SchedulerEvent<TAppointment, TResourceId extends SchedulerId> = {
|
|
|
23
23
|
endMin: number;
|
|
24
24
|
title: string;
|
|
25
25
|
};
|
|
26
|
+
type SchedulerAppointmentVisualState = "normal" | "ghost" | "dragging";
|
|
27
|
+
type SchedulerPresentationAppointment<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId> & {
|
|
28
|
+
renderKey: string;
|
|
29
|
+
visualState: SchedulerAppointmentVisualState;
|
|
30
|
+
};
|
|
26
31
|
type SchedulerDragState<TResourceId extends SchedulerId> = {
|
|
27
32
|
kind: "none";
|
|
28
33
|
} | {
|
|
@@ -84,10 +89,11 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
|
|
|
84
89
|
onAppointmentChange?: (args: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>) => Promise<void> | void;
|
|
85
90
|
renderResourceHeader?: (resource: TResource) => React.ReactNode;
|
|
86
91
|
renderAppointment?: (args: {
|
|
87
|
-
appointment:
|
|
92
|
+
appointment: SchedulerPresentationAppointment<TAppointment, TResourceId> & {
|
|
88
93
|
lane: number;
|
|
89
94
|
lanes: number;
|
|
90
95
|
};
|
|
96
|
+
isDropInvalid: boolean;
|
|
91
97
|
onPointerDown: (e: React.PointerEvent) => void;
|
|
92
98
|
onResizePointerDown: (e: React.PointerEvent) => void;
|
|
93
99
|
appointmentAppearance?: SchedulerAppointmentAppearance;
|
|
@@ -111,7 +117,7 @@ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResou
|
|
|
111
117
|
dayEnd?: string;
|
|
112
118
|
};
|
|
113
119
|
|
|
114
|
-
declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
|
|
120
|
+
declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, resourceAppointmentClassMap, getResourceAppointmentAppearance, getResourceAppointmentColorToken, appointmentColorTokenClassMap, getResourceAppointmentBackground, renderToolbar, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd, }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
|
|
115
121
|
|
|
116
122
|
type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends SchedulerId> = {
|
|
117
123
|
getId: (appointment: TAppointment) => SchedulerId;
|
|
@@ -121,4 +127,4 @@ type ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId extends Sc
|
|
|
121
127
|
};
|
|
122
128
|
declare function applySchedulerAppointmentChange<TAppointment, TResourceId extends SchedulerId>(appointments: TAppointment[], change: SchedulerAppointmentChangeArgs<TAppointment, TResourceId>, options: ApplySchedulerAppointmentChangeOptions<TAppointment, TResourceId>): TAppointment[];
|
|
123
129
|
|
|
124
|
-
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, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
|
|
130
|
+
export { type ApplySchedulerAppointmentChangeOptions, type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerAppointmentAppearance, type SchedulerAppointmentChangeArgs, type SchedulerAppointmentColorToken, type SchedulerAppointmentVisualState, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerPresentationAppointment, type SchedulerProps, type SchedulerResourceClassMap, type SchedulerToolbarRenderArgs, applySchedulerAppointmentChange };
|