@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.js.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":["React","Button","jsx","React2","jsxs","React3","format","React4","pointerMin","nextEndMin","React6"],"mappings":"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","file":"index.js","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":["React","nextDrag","React3","jsx","jsxs","React4","React5","Button","React6","format","React7","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,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA;AAAA,MACA,SAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,aAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0HAAA,EAA2H,eAE1I,CAAA,GACE,IAAA;AAAA,wBACJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,sBAAY,KAAA,EAAM,CAAA;AAAA,QACzD,8BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAsD,uBAAY,CAAA,GAC/E,IAAA;AAAA,wBACJ,GAAA;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,OAAO,MAAA,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,GAAoBA,eAAQ,MAAM,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACvE,EAAA,MAAM,SAAA,GAAkBA,eAAQ,MAAM,SAAA,CAAU,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,UAAA,GAAmBA,MAAA,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,MAAA,CAAA,OAAA;AAAA,IACvB,MAAM,OAAA,GAAU,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,IAC1C,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,YAAA,GAAqBA,MAAA,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,eAAQ,MAAM,MAAA,CAAO,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAE5E,EAAA,MAAM,WAAA,GAAoBA,eAAQ,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,eAAQ,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,GAAU,gBAA0C,EAAE,IAAA,EAAM,QAAQ,CAAA;AACxF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,MAAA,CAA8C,EAAE,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAyB,cAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,MAAA,CAAwC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9E,EAAA,MAAM,cAAA,GAAuB,cAAsD,IAAI,CAAA;AACvF,EAAA,MAAM,gBAAA,GAAyB,cAA+B,IAAI,CAAA;AAClE,EAAA,MAAM,QAAA,GAAiB,cAAsB,IAAI,CAAA;AAEjD,EAAM,iBAAU,MAAM;AACpB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAM,iBAAU,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,GAAqB,MAAA,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,GAA4B,MAAA,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,GAAmB,MAAA,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,GAAsB,eAAQ,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,GAAoB,MAAA,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,GAA0B,MAAA,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,GAA4B,MAAA,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,GAA4B,MAAA,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,GAA0B,mBAAY,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,eAAQ,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,eAAQ,MAAM;AAChD,IAAA,OAAO,sBAAA,CAAuB,WAAW,WAAW,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,iBAAA,GAA0BA,eAAQ,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,eAAQ,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,eAAQ,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,eAAQ,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,uBACEC,GAAAA;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/DC,IAAAA;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,uBAAOD,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,QAAA,CAAS,KAAA,EAAM,CAAA;AACjC;ACMO,SAAS,MAAA,CAGd,EAAE,SAAA,EAAW,oBAAA,EAAqB,EAAiD;AACnF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA;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,qBACdC,IAAAA;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,mBAClBD,GAAAA,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,GAAAA;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,kBAAAC,IAAAA;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/DD,GAAAA;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,GAAAA;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,GAAAA;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,GAA6CE,MAAA,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,MAAA,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,uBACEJ,GAAAA;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,GAAUK,gBAAS,QAAA,oBAAY,IAAI,MAAM,CAAA;AAE/D,EAAMA,iBAAU,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,GAAa,aAAa,KAAK,CAAA;AACrC,EAAA,MAAM,gBAAgB,WAAA,CAAY,UAAA,EAAY,EAAE,YAAA,EAAc,GAAG,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,UAAU,UAAA,CAAW,KAAK,GAAG,EAAE,YAAA,EAAc,GAAG,CAAA;AACpE,EAAA,MAAM,OAAe,EAAC;AAEtB,EAAA,KAAA,IAAS,GAAA,GAAM,eAAe,GAAA,IAAO,WAAA,EAAa,MAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;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,CAAS,SAAA,CAAU,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,UAE3C,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAuB,QAAA,EAAAM,MAAAA,CAAO,KAAA,EAAO,WAAW,CAAA,EAAE,CAAA;AAAA,sBACjEN,GAAAA;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,CAAS,SAAA,CAAU,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,UAE1C,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,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,GAAAA;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,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,MAAA,MAAM,UAAA,GAAa,QAAA,GAAW,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA,GAAI,KAAA;AACzD,MAAA,uBACEA,GAAAA;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,CAAC,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA,IAAK,kCAAA;AAAA,YAC5B,OAAA,CAAQ,GAAG,CAAA,IAAK,CAAC,UAAA,IAAc;AAAA,WACjC;AAAA,UACA,OAAA,EAAS,MAAM,QAAA,GAAW,GAAG,CAAA;AAAA,UAE5B,QAAA,EAAAM,MAAAA,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,GAAuBC,qBAA0C,IAAI,CAAA;AAE3E,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,OAAA,GAAgBA,kBAAW,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,gBAAS,KAAK,CAAA;AACpE,EAAA,MAAM,UAAA,GAAmBA,cAA2B,IAAI,CAAA;AACxD,EAAA,MAAM,UAAA,GAAmBA,cAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,OAAO,cAAA,IAAkB,gBAAA;AAE/B,EAAA,MAAM,OAAA,GAAgBA,MAAA,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,iBAAU,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,uBACEP,GAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAA,IAC3D,QAAA,kBAAAA,GAAAA,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,IAAiBO,MAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA;AAMd,IAAA,OAAaA,oBAAa,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,uBACEP,GAAAA;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,GAAAA;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,uBACEC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,8CAAA;AAAA,QAET,QAAA,EAAAM,MAAAA,CAAO,YAAA,EAAc,KAAK;AAAA;AAAA,KAC7B,EACF,CAAA;AAAA,oBACAN,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAM,QAAA;AAAA,QAEN,QAAA,kBAAAA,GAAAA;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,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA;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,GAAAA;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,GAAAA,CAAA,QAAA,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,uBACEA,GAAAA,CAAA,QAAA,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,GAAoBQ,eAAQ,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,uBACEP,IAAAA;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,wBAAAD,GAAAA;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,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAA,EAAa,EACnC,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,UAAA;AAAA,gBACA,WAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,4BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdA,GAAAA;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,GAAAA;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.js","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/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-100:oklch(93.6% .032 17.717);--color-red-950:oklch(25.8% .092 26.042);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-950:oklch(27.4% .072 132.109);--color-green-100:oklch(96.2% .044 156.743);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-900:oklch(21% .034 264.665);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-900:oklch(21% .006 285.885);--color-neutral-100:oklch(97% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-stone-100:oklch(97% .001 106.424);--color-stone-900:oklch(21.6% .006 56.043);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-normal:var(--tracking-normal);--leading-tight:1.25;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-x-1{inset-inline:calc(var(--spacing) * 1)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-50{z-index:50}.mx-auto{margin-inline:auto}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.w-8{width:calc(var(--spacing) * 8)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-\[400px\]{min-width:400px}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-grab{cursor:grab}.cursor-ns-resize{cursor:ns-resize}.resize{resize:both}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-border\/90{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/90{background-color:color-mix(in oklab, var(--border) 90%, transparent)}}.bg-card{background-color:var(--card)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-fuchsia-100{background-color:var(--color-fuchsia-100)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-lime-100{background-color:var(--color-lime-100)}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-100{background-color:var(--color-red-100)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-300\/90{background-color:#cad5e2e6}@supports (color:color-mix(in lab, red, red)){.bg-slate-300\/90{background-color:color-mix(in oklab, var(--color-slate-300) 90%, transparent)}}.bg-stone-100{background-color:var(--color-stone-100)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-white{background-color:var(--color-white)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-100{background-color:var(--color-zinc-100)}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:calc(var(--tracking-normal) - .025em);letter-spacing:calc(var(--tracking-normal) - .025em)}.tracking-wide{--tw-tracking:calc(var(--tracking-normal) + .025em);letter-spacing:calc(var(--tracking-normal) + .025em)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-slate-500{color:var(--color-slate-500)}.opacity-60{opacity:.6}.shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:bg-border:hover{background-color:var(--border)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width:64rem){.lg\:w-full{width:100%}}.dark\:bg-amber-950\/40:is(.dark *){background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-blue-950\/40:is(.dark *){background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-cyan-950\/40:is(.dark *){background-color:#05334566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-cyan-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-cyan-950) 40%, transparent)}}.dark\:bg-emerald-950\/40:is(.dark *){background-color:#002c2266}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-950) 40%, transparent)}}.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:#4b004f66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-fuchsia-950) 40%, transparent)}}.dark\:bg-gray-900\/40:is(.dark *){background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.dark\:bg-green-950\/40:is(.dark *){background-color:#032e1566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-green-950) 40%, transparent)}}.dark\:bg-indigo-950\/40:is(.dark *){background-color:#1e1a4d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-indigo-950) 40%, transparent)}}.dark\:bg-lime-950\/40:is(.dark *){background-color:#192e0366}@supports (color:color-mix(in lab, red, red)){.dark\:bg-lime-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-lime-950) 40%, transparent)}}.dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.dark\:bg-neutral-900\/40:is(.dark *){background-color:#17171766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-neutral-900) 40%, transparent)}}.dark\:bg-orange-950\/40:is(.dark *){background-color:#44130666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-orange-950) 40%, transparent)}}.dark\:bg-pink-950\/40:is(.dark *){background-color:#51042466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-pink-950) 40%, transparent)}}.dark\:bg-purple-950\/40:is(.dark *){background-color:#3c036666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-purple-950) 40%, transparent)}}.dark\:bg-red-950\/40:is(.dark *){background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-950\/40:is(.dark *){background-color:#4d021866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-rose-950) 40%, transparent)}}.dark\:bg-sky-950\/40:is(.dark *){background-color:#052f4a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-sky-950) 40%, transparent)}}.dark\:bg-slate-900\/40:is(.dark *){background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.dark\:bg-stone-900\/40:is(.dark *){background-color:#1c191766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-stone-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-stone-900) 40%, transparent)}}.dark\:bg-teal-950\/40:is(.dark *){background-color:#022f2e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-teal-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-teal-950) 40%, transparent)}}.dark\:bg-violet-950\/40:is(.dark *){background-color:#2f0d6866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-violet-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-violet-950) 40%, transparent)}}.dark\:bg-yellow-950\/40:is(.dark *){background-color:#43200466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-950) 40%, transparent)}}.dark\:bg-zinc-900\/40:is(.dark *){background-color:#18181b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 40%, transparent)}}}:root{--topbar-h:39px;--header-h:87px;--footer-h:359px;--site-content-min-h:calc(100dvh - var(--topbar-h) - var(--header-h) - var(--footer-h));--background:oklch(100% 0 0);--foreground:oklch(21.93% .0122 145.145);--card:oklch(100% 0 0);--card-foreground:oklch(21.93% .0122 145.145);--popover:oklch(100% 0 0);--popover-foreground:oklch(21.93% .0122 145.145);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(100% 0 0);--secondary:oklch(96.07% .0112 141.263);--secondary-foreground:oklch(44.45% .0502 141.758);--muted:oklch(96.07% .0112 141.263);--muted-foreground:oklch(53.51% .0432 142.652);--accent:oklch(96.07% .0112 141.263);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(68.07% .1129 109.059);--destructive-foreground:oklch(100% 0 0);--border:oklch(91% .021 140.896);--input:oklch(91% .021 140.896);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(60.42% .0688 140.724);--chart-3:oklch(84.06% .0531 141.655);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(91% .021 140.896);--sidebar:oklch(97.77% .0078 139.442);--sidebar-foreground:oklch(21.93% .0122 145.145);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(91% .021 140.896);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(91% .021 140.896);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:4px;--shadow-blur:10px;--shadow-spread:0px;--shadow-opacity:.05;--shadow-color:0 0 0;--shadow-2xs:0px 4px 10px 0px #00000008;--shadow-xs:0px 4px 10px 0px #00000008;--shadow-sm:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow-md:0px 4px 10px 0px #0000000d, 0px 2px 4px -1px #0000000d;--shadow-lg:0px 4px 10px 0px #0000000d, 0px 4px 6px -1px #0000000d;--shadow-xl:0px 4px 10px 0px #0000000d, 0px 8px 10px -1px #0000000d;--shadow-2xl:0px 4px 10px 0px #00000021;--tracking-normal:.01em;--spacing:.3rem;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.dark{--background:oklch(21.93% .0122 145.145);--foreground:oklch(96.07% .0112 141.263);--card:oklch(21.93% .0122 145.145);--card-foreground:oklch(96.07% .0112 141.263);--popover:oklch(21.93% .0122 145.145);--popover-foreground:oklch(96.07% .0112 141.263);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(21.93% .0122 145.145);--secondary:oklch(27.44% .0184 145.053);--secondary-foreground:oklch(84.06% .0531 141.655);--muted:oklch(27.44% .0184 145.053);--muted-foreground:oklch(60.42% .0688 140.724);--accent:oklch(27.44% .0184 145.053);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(88.44% .1663 107.49);--destructive-foreground:oklch(100% 0 0);--border:oklch(27.44% .0184 145.053);--input:oklch(27.44% .0184 145.053);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(84.06% .0531 141.655);--chart-3:oklch(60.42% .0688 140.724);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(35.96% .0355 143.305);--sidebar:oklch(21.93% .0122 145.145);--sidebar-foreground:oklch(96.07% .0112 141.263);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(21.93% .0122 145.145);--sidebar-accent:oklch(27.44% .0184 145.053);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(27.44% .0184 145.053);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:10px;--shadow-blur:20px;--shadow-spread:0px;--shadow-opacity:.4;--shadow-color:0 0 0;--shadow-2xs:0px 10px 20px 0px #0003;--shadow-xs:0px 10px 20px 0px #0003;--shadow-sm:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow-md:0px 10px 20px 0px #0006, 0px 2px 4px -1px #0006;--shadow-lg:0px 10px 20px 0px #0006, 0px 4px 6px -1px #0006;--shadow-xl:0px 10px 20px 0px #0006, 0px 8px 10px -1px #0006;--shadow-2xl:0px 10px 20px 0px #000;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.rfs-root{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--rfs-text)}.rfs-root--drag-move{cursor:grabbing;-webkit-user-select:none;user-select:none}.rfs-root--drag-resize{cursor:ns-resize;-webkit-user-select:none;user-select:none}.rfs-toolbar{margin-bottom:calc(var(--spacing) * 3);align-items:center;gap:calc(var(--spacing) * 2);display:flex}.rfs-btn{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-btn:hover{background:var(--rfs-bg)}.rfs-btn:disabled{cursor:not-allowed;opacity:.5}.rfs-date-label{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-shell{border-radius:var(--radius);border-style:var(--tw-border-style);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);overflow-x:auto}.rfs-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--rfs-border);display:flex}.rfs-gutter{left:calc(var(--spacing) * 0);z-index:20;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky}.rfs-resource-header{border-right-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);border-right-width:1px;border-color:var(--rfs-border)}.rfs-resource-subtitle{margin-top:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--rfs-muted)}.rfs-body{display:flex}.rfs-times{left:calc(var(--spacing) * 0);z-index:10;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky;box-shadow:8px 0 12px -12px #0000002e}.rfs-time-tick{left:calc(var(--spacing) * 1);color:var(--rfs-muted);font-size:11px;position:absolute}.rfs-grid{flex:1;display:flex}.rfs-col{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border)}.rfs-col-inner{position:relative}.rfs-hour-line,.rfs-slot-line{right:calc(var(--spacing) * 0);left:calc(var(--spacing) * 0);border-top-style:var(--tw-border-style);--tw-border-style:dotted;border-style:dotted;border-top-width:1px;border-color:var(--rfs-border);opacity:.5;position:absolute}.rfs-card-slot{padding:calc(var(--spacing) * .5);position:absolute}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-950:oklch(25.8% .092 26.042);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-950:oklch(27.4% .072 132.109);--color-green-100:oklch(96.2% .044 156.743);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-900:oklch(21% .034 264.665);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-900:oklch(21% .006 285.885);--color-neutral-100:oklch(97% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-stone-100:oklch(97% .001 106.424);--color-stone-900:oklch(21.6% .006 56.043);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:var(--tracking-normal);--leading-tight:1.25;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-x-1{inset-inline:calc(var(--spacing) * 1)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1{top:calc(var(--spacing) * 1)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.bottom-1{bottom:calc(var(--spacing) * 1)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-50{z-index:50}.mx-auto{margin-inline:auto}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-\[400px\]{min-width:400px}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-ns-resize{cursor:ns-resize}.resize{resize:both}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-border\/90{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/90{background-color:color-mix(in oklab, var(--border) 90%, transparent)}}.bg-card{background-color:var(--card)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-fuchsia-100{background-color:var(--color-fuchsia-100)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-lime-100{background-color:var(--color-lime-100)}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-100\/80{background-color:#ffe2e2cc}@supports (color:color-mix(in lab, red, red)){.bg-red-100\/80{background-color:color-mix(in oklab, var(--color-red-100) 80%, transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-300\/90{background-color:#cad5e2e6}@supports (color:color-mix(in lab, red, red)){.bg-slate-300\/90{background-color:color-mix(in oklab, var(--color-slate-300) 90%, transparent)}}.bg-stone-100{background-color:var(--color-stone-100)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-100{background-color:var(--color-zinc-100)}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:calc(var(--tracking-normal) - .025em);letter-spacing:calc(var(--tracking-normal) - .025em)}.tracking-wide{--tw-tracking:calc(var(--tracking-normal) + .025em);letter-spacing:calc(var(--tracking-normal) + .025em)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-950{color:var(--color-red-950)}.text-slate-500{color:var(--color-slate-500)}.text-white{color:var(--color-white)}.opacity-35{opacity:.35}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-border\/70{--tw-ring-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.ring-border\/70{--tw-ring-color:color-mix(in oklab, var(--border) 70%, transparent)}}.ring-red-500\/60{--tw-ring-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:bg-border:hover{background-color:var(--border)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width:64rem){.lg\:w-full{width:100%}}.dark\:bg-amber-950\/40:is(.dark *){background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-blue-950\/40:is(.dark *){background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-cyan-950\/40:is(.dark *){background-color:#05334566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-cyan-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-cyan-950) 40%, transparent)}}.dark\:bg-emerald-950\/40:is(.dark *){background-color:#002c2266}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-950) 40%, transparent)}}.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:#4b004f66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-fuchsia-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-fuchsia-950) 40%, transparent)}}.dark\:bg-gray-900\/40:is(.dark *){background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.dark\:bg-green-950\/40:is(.dark *){background-color:#032e1566}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-green-950) 40%, transparent)}}.dark\:bg-indigo-950\/40:is(.dark *){background-color:#1e1a4d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-indigo-950) 40%, transparent)}}.dark\:bg-lime-950\/40:is(.dark *){background-color:#192e0366}@supports (color:color-mix(in lab, red, red)){.dark\:bg-lime-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-lime-950) 40%, transparent)}}.dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.dark\:bg-neutral-900\/40:is(.dark *){background-color:#17171766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-neutral-900) 40%, transparent)}}.dark\:bg-orange-950\/40:is(.dark *){background-color:#44130666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-orange-950) 40%, transparent)}}.dark\:bg-pink-950\/40:is(.dark *){background-color:#51042466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-pink-950) 40%, transparent)}}.dark\:bg-purple-950\/40:is(.dark *){background-color:#3c036666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-purple-950) 40%, transparent)}}.dark\:bg-red-950\/40:is(.dark *){background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-950\/40:is(.dark *){background-color:#4d021866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-rose-950) 40%, transparent)}}.dark\:bg-sky-950\/40:is(.dark *){background-color:#052f4a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-sky-950) 40%, transparent)}}.dark\:bg-slate-900\/40:is(.dark *){background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.dark\:bg-stone-900\/40:is(.dark *){background-color:#1c191766}@supports (color:color-mix(in lab, red, red)){.dark\:bg-stone-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-stone-900) 40%, transparent)}}.dark\:bg-teal-950\/40:is(.dark *){background-color:#022f2e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-teal-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-teal-950) 40%, transparent)}}.dark\:bg-violet-950\/40:is(.dark *){background-color:#2f0d6866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-violet-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-violet-950) 40%, transparent)}}.dark\:bg-yellow-950\/40:is(.dark *){background-color:#43200466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-950\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-950) 40%, transparent)}}.dark\:bg-zinc-900\/40:is(.dark *){background-color:#18181b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 40%, transparent)}}.dark\:text-red-100:is(.dark *){color:var(--color-red-100)}}:root{--topbar-h:39px;--header-h:87px;--footer-h:359px;--site-content-min-h:calc(100dvh - var(--topbar-h) - var(--header-h) - var(--footer-h));--background:oklch(100% 0 0);--foreground:oklch(21.93% .0122 145.145);--card:oklch(100% 0 0);--card-foreground:oklch(21.93% .0122 145.145);--popover:oklch(100% 0 0);--popover-foreground:oklch(21.93% .0122 145.145);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(100% 0 0);--secondary:oklch(96.07% .0112 141.263);--secondary-foreground:oklch(44.45% .0502 141.758);--muted:oklch(96.07% .0112 141.263);--muted-foreground:oklch(53.51% .0432 142.652);--accent:oklch(96.07% .0112 141.263);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(68.07% .1129 109.059);--destructive-foreground:oklch(100% 0 0);--border:oklch(91% .021 140.896);--input:oklch(91% .021 140.896);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(60.42% .0688 140.724);--chart-3:oklch(84.06% .0531 141.655);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(91% .021 140.896);--sidebar:oklch(97.77% .0078 139.442);--sidebar-foreground:oklch(21.93% .0122 145.145);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(91% .021 140.896);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(91% .021 140.896);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:4px;--shadow-blur:10px;--shadow-spread:0px;--shadow-opacity:.05;--shadow-color:0 0 0;--shadow-2xs:0px 4px 10px 0px #00000008;--shadow-xs:0px 4px 10px 0px #00000008;--shadow-sm:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow:0px 4px 10px 0px #0000000d, 0px 1px 2px -1px #0000000d;--shadow-md:0px 4px 10px 0px #0000000d, 0px 2px 4px -1px #0000000d;--shadow-lg:0px 4px 10px 0px #0000000d, 0px 4px 6px -1px #0000000d;--shadow-xl:0px 4px 10px 0px #0000000d, 0px 8px 10px -1px #0000000d;--shadow-2xl:0px 4px 10px 0px #00000021;--tracking-normal:.01em;--spacing:.3rem;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.dark{--background:oklch(21.93% .0122 145.145);--foreground:oklch(96.07% .0112 141.263);--card:oklch(21.93% .0122 145.145);--card-foreground:oklch(96.07% .0112 141.263);--popover:oklch(21.93% .0122 145.145);--popover-foreground:oklch(96.07% .0112 141.263);--primary:oklch(72.56% .0713 141.056);--primary-foreground:oklch(21.93% .0122 145.145);--secondary:oklch(27.44% .0184 145.053);--secondary-foreground:oklch(84.06% .0531 141.655);--muted:oklch(27.44% .0184 145.053);--muted-foreground:oklch(60.42% .0688 140.724);--accent:oklch(27.44% .0184 145.053);--accent-foreground:oklch(72.56% .0713 141.056);--destructive:oklch(88.44% .1663 107.49);--destructive-foreground:oklch(100% 0 0);--border:oklch(27.44% .0184 145.053);--input:oklch(27.44% .0184 145.053);--ring:oklch(72.56% .0713 141.056);--chart-1:oklch(72.56% .0713 141.056);--chart-2:oklch(84.06% .0531 141.655);--chart-3:oklch(60.42% .0688 140.724);--chart-4:oklch(49.29% .0598 141.478);--chart-5:oklch(35.96% .0355 143.305);--sidebar:oklch(21.93% .0122 145.145);--sidebar-foreground:oklch(96.07% .0112 141.263);--sidebar-primary:oklch(72.56% .0713 141.056);--sidebar-primary-foreground:oklch(21.93% .0122 145.145);--sidebar-accent:oklch(27.44% .0184 145.053);--sidebar-accent-foreground:oklch(72.56% .0713 141.056);--sidebar-border:oklch(27.44% .0184 145.053);--sidebar-ring:oklch(72.56% .0713 141.056);--font-sans:Geist, ui-sans-serif, sans-serif, system-ui;--font-serif:PT Serif, ui-serif, serif;--font-mono:Inconsolata, ui-monospace, monospace;--radius:.28rem;--shadow-x:0px;--shadow-y:10px;--shadow-blur:20px;--shadow-spread:0px;--shadow-opacity:.4;--shadow-color:0 0 0;--shadow-2xs:0px 10px 20px 0px #0003;--shadow-xs:0px 10px 20px 0px #0003;--shadow-sm:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow:0px 10px 20px 0px #0006, 0px 1px 2px -1px #0006;--shadow-md:0px 10px 20px 0px #0006, 0px 2px 4px -1px #0006;--shadow-lg:0px 10px 20px 0px #0006, 0px 4px 6px -1px #0006;--shadow-xl:0px 10px 20px 0px #0006, 0px 8px 10px -1px #0006;--shadow-2xl:0px 10px 20px 0px #000;--rfs-bg:var(--background);--rfs-surface:var(--card);--rfs-border:var(--border);--rfs-text:var(--foreground);--rfs-muted:var(--muted-foreground)}.rfs-root{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--rfs-text)}.rfs-root--drag-move{cursor:grabbing;-webkit-user-select:none;user-select:none}.rfs-root--drag-resize{cursor:ns-resize;-webkit-user-select:none;user-select:none}.rfs-card-slot--ghost{z-index:10;pointer-events:none}.rfs-card-slot--dragging{z-index:30}.rfs-drag-overlay{z-index:60;pointer-events:none;position:fixed}.rfs-toolbar{margin-bottom:calc(var(--spacing) * 3);align-items:center;gap:calc(var(--spacing) * 2);display:flex}.rfs-btn{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-btn:hover{background:var(--rfs-bg)}.rfs-btn:disabled{cursor:not-allowed;opacity:.5}.rfs-date-label{border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface)}.rfs-shell{border-radius:var(--radius);border-style:var(--tw-border-style);border-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);overflow-x:auto}.rfs-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--rfs-border);display:flex}.rfs-gutter{left:calc(var(--spacing) * 0);z-index:20;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky}.rfs-resource-header{border-right-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);border-right-width:1px;border-color:var(--rfs-border)}.rfs-resource-subtitle{margin-top:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--rfs-muted)}.rfs-body{display:flex}.rfs-times{left:calc(var(--spacing) * 0);z-index:10;border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border);background:var(--rfs-surface);flex-shrink:0;position:sticky;box-shadow:8px 0 12px -12px #0000002e}.rfs-time-tick{left:calc(var(--spacing) * 1);color:var(--rfs-muted);font-size:11px;position:absolute}.rfs-grid{flex:1;display:flex}.rfs-col{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--rfs-border)}.rfs-col-inner{position:relative}.rfs-hour-line,.rfs-slot-line{right:calc(var(--spacing) * 0);left:calc(var(--spacing) * 0);border-top-style:var(--tw-border-style);--tw-border-style:dotted;border-style:dotted;border-top-width:1px;border-color:var(--rfs-border);opacity:.5;position:absolute}.rfs-card-slot{padding:calc(var(--spacing) * .5);position:absolute}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
|