{"version":3,"file":"ScheduleEvent.cjs","names":["DragContext","Box","UnstyledButton","classes"],"sources":["../../../src/components/ScheduleEvent/ScheduleEvent.tsx"],"sourcesContent":["import { use, useEffect, useRef } from 'react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getRadius,\n  MantineRadius,\n  StylesApiProps,\n  UnstyledButton,\n  useProps,\n  useStyles,\n} from '@mantine/core';\nimport { ScheduleEventData, ScheduleMode } from '../../types';\nimport { DragContext } from '../DragContext/DragContext';\nimport classes from './ScheduleEvent.module.css';\n\nexport type ScheduleEventStylesNames = 'event' | 'eventInner' | 'eventResizeHandle';\n\nexport type ScheduleEventVariant = 'filled' | 'light';\nexport type ScheduleEventCssVariables = {\n  event: '--event-bg' | '--event-color' | '--event-radius' | '--event-hover';\n};\n\nexport type RenderEventBody = (event: ScheduleEventData<any>) => React.ReactNode;\n\nexport type RenderEvent = (\n  event: ScheduleEventData,\n  props: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode }\n) => React.ReactElement;\n\nexport interface ScheduleEventProps\n  extends BoxProps, StylesApiProps<ScheduleEventFactory>, ElementProps<'button'> {\n  __staticSelector?: string;\n\n  /** Event to display */\n  event: ScheduleEventData;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius @default 'sm' */\n  radius?: MantineRadius;\n\n  /** If set, event has `white-space: nowrap` @default false */\n  nowrap?: boolean;\n\n  /** If set, event shrinks its font-size with limited height @default false */\n  autoSize?: boolean;\n\n  /** Event size @default 'sm' */\n  size?: 'sm' | 'md' | (string & {});\n\n  /** Function to customize event body, `event` object is passed as first argument */\n  renderEventBody?: RenderEventBody;\n\n  /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n  renderEvent?: RenderEvent;\n\n  /** Event hanging position */\n  hanging?: 'start' | 'end' | 'both' | 'none';\n\n  /** If true, event can be dragged @default false */\n  draggable?: boolean;\n\n  /** Called when event drag starts */\n  onEventDragStart?: (event: ScheduleEventData) => void;\n\n  /** Called when event drag ends */\n  onEventDragEnd?: () => void;\n\n  /** If true, event is currently being dragged @default false */\n  isDragging?: boolean;\n\n  /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n  mode?: ScheduleMode;\n\n  /** If true, event can be resized by dragging its edges @default false */\n  withResize?: boolean;\n\n  /** Called when resize starts on an edge */\n  onResizeStart?: (edge: 'top' | 'bottom', e: React.PointerEvent) => void;\n\n  /** If true, event is currently being resized @default false */\n  isResizing?: boolean;\n}\n\nexport type ScheduleEventFactory = Factory<{\n  props: ScheduleEventProps;\n  ref: HTMLButtonElement;\n  stylesNames: ScheduleEventStylesNames;\n  vars: ScheduleEventCssVariables;\n  variant: ScheduleEventVariant;\n}>;\n\nconst defaultProps = {\n  __staticSelector: 'ScheduleEvent',\n  mode: 'default',\n  radius: 'sm' as MantineRadius,\n} satisfies Partial<ScheduleEventProps>;\n\nconst varsResolver = createVarsResolver<ScheduleEventFactory>(\n  (theme, { event, variant, radius }) => {\n    const colors = theme.variantColorResolver({\n      color: event.color || theme.primaryColor,\n      theme,\n      variant: variant || event.variant || 'light',\n      autoContrast: true,\n    });\n\n    return {\n      event: {\n        '--event-bg': colors.background,\n        '--event-hover': colors.hover,\n        '--event-color': colors.color,\n        '--event-radius': getRadius(radius),\n      },\n    };\n  }\n);\n\nexport const ScheduleEvent = factory<ScheduleEventFactory>((_props) => {\n  const props = useProps('ScheduleEvent', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    attributes,\n    children,\n    nowrap,\n    radius,\n    color,\n    __staticSelector,\n    event,\n    renderEventBody,\n    renderEvent,\n    size,\n    autoSize,\n    mod,\n    hanging,\n    draggable = false,\n    onEventDragStart,\n    onEventDragEnd,\n    isDragging = false,\n    mode,\n    withResize = false,\n    onResizeStart,\n    isResizing = false,\n    ...others\n  } = props;\n\n  const ctx = use(DragContext);\n\n  const getStyles = useStyles<ScheduleEventFactory>({\n    name: __staticSelector,\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n    rootSelector: 'event',\n  });\n\n  const handleDragStart = (e: React.DragEvent<HTMLButtonElement>) => {\n    if (!draggable) {\n      e.preventDefault();\n      return;\n    }\n\n    e.dataTransfer.effectAllowed = 'move';\n    e.dataTransfer.setData('application/json', JSON.stringify({ eventId: event.id }));\n    onEventDragStart?.(event);\n    ctx.onDragStart?.(event);\n  };\n\n  const handleDragEnd = () => {\n    onEventDragEnd?.();\n    ctx.onDragEnd?.();\n  };\n\n  const isCurrentlyDragging = isDragging || ctx.draggedEventId === event.id;\n  const isAnyEventDragging = ctx.isDragging || false;\n\n  const dragEndRef = useRef(ctx.onDragEnd);\n  dragEndRef.current = ctx.onDragEnd;\n\n  useEffect(() => {\n    if (isCurrentlyDragging) {\n      return () => {\n        dragEndRef.current?.();\n      };\n    }\n    return undefined;\n  }, [isCurrentlyDragging]);\n\n  const showResizeHandles = withResize && mode !== 'static';\n\n  const eventChildren = (\n    <>\n      {showResizeHandles && (\n        <Box\n          {...getStyles('eventResizeHandle')}\n          mod={{ edge: 'top' }}\n          onPointerDown={(e: React.PointerEvent) => onResizeStart?.('top', e)}\n        />\n      )}\n      <Box mod={{ nowrap, size, autoSize, hanging }} {...getStyles('eventInner')}>\n        {typeof renderEventBody === 'function' ? renderEventBody(event) : event.title}\n      </Box>\n      {showResizeHandles && (\n        <Box\n          {...getStyles('eventResizeHandle')}\n          mod={{ edge: 'bottom' }}\n          onPointerDown={(e: React.PointerEvent) => onResizeStart?.('bottom', e)}\n        />\n      )}\n    </>\n  );\n\n  const rootProps = {\n    ...getStyles('event'),\n    'data-event-id': event.id,\n    size,\n    title: event.title,\n    mod: [\n      {\n        autoSize,\n        hanging,\n        draggable,\n        dragging: isCurrentlyDragging,\n        'any-dragging': isAnyEventDragging,\n        static: mode === 'static',\n        resizing: isResizing,\n        resizable: showResizeHandles,\n      },\n      mod,\n    ],\n    ...others,\n    draggable: draggable && mode !== 'static',\n    tabIndex: mode === 'static' ? -1 : 0,\n    onDragStart: mode === 'static' ? undefined : handleDragStart,\n    onDragEnd: mode === 'static' ? undefined : handleDragEnd,\n    onClick: mode === 'static' ? undefined : others.onClick,\n    children: eventChildren,\n  };\n\n  if (typeof renderEvent === 'function') {\n    return renderEvent(event, rootProps);\n  }\n\n  return <UnstyledButton {...rootProps} />;\n});\n\nScheduleEvent.displayName = '@mantine/schedule/ScheduleEvent';\nScheduleEvent.classes = classes;\nScheduleEvent.varsResolver = varsResolver;\n"],"mappings":";;;;;;;AA8FA,MAAM,eAAe;CACnB,kBAAkB;CAClB,MAAM;CACN,QAAQ;AACV;AAEA,MAAM,gBAAA,GAAA,cAAA,mBAAA,EACH,OAAO,EAAE,OAAO,SAAS,aAAa;CACrC,MAAM,SAAS,MAAM,qBAAqB;EACxC,OAAO,MAAM,SAAS,MAAM;EAC5B;EACA,SAAS,WAAW,MAAM,WAAW;EACrC,cAAc;CAChB,CAAC;CAED,OAAO,EACL,OAAO;EACL,cAAc,OAAO;EACrB,iBAAiB,OAAO;EACxB,iBAAiB,OAAO;EACxB,mBAAA,GAAA,cAAA,UAAA,CAA4B,MAAM;CACpC,EACF;AACF,CACF;AAEA,MAAa,iBAAA,GAAA,cAAA,QAAA,EAA+C,WAAW;CACrE,MAAM,SAAA,GAAA,cAAA,SAAA,CAAiB,iBAAiB,cAAc,MAAM;CAC5D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,UACA,QACA,QACA,OACA,kBACA,OACA,iBACA,aACA,MACA,UACA,KACA,SACA,YAAY,OACZ,kBACA,gBACA,aAAa,OACb,MACA,aAAa,OACb,eACA,aAAa,OACb,GAAG,WACD;CAEJ,MAAM,OAAA,GAAA,MAAA,IAAA,CAAUA,oBAAAA,WAAW;CAE3B,MAAM,aAAA,GAAA,cAAA,UAAA,CAA4C;EAChD,MAAM;EACN,SAAA,6BAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,mBAAmB,MAA0C;EACjE,IAAI,CAAC,WAAW;GACd,EAAE,eAAe;GACjB;EACF;EAEA,EAAE,aAAa,gBAAgB;EAC/B,EAAE,aAAa,QAAQ,oBAAoB,KAAK,UAAU,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC;EAChF,mBAAmB,KAAK;EACxB,IAAI,cAAc,KAAK;CACzB;CAEA,MAAM,sBAAsB;EAC1B,iBAAiB;EACjB,IAAI,YAAY;CAClB;CAEA,MAAM,sBAAsB,cAAc,IAAI,mBAAmB,MAAM;CACvE,MAAM,qBAAqB,IAAI,cAAc;CAE7C,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,IAAI,SAAS;CACvC,WAAW,UAAU,IAAI;CAEzB,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,qBACF,aAAa;GACX,WAAW,UAAU;EACvB;CAGJ,GAAG,CAAC,mBAAmB,CAAC;CAExB,MAAM,oBAAoB,cAAc,SAAS;CAEjD,MAAM,gBACJ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACG,qBACC,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,KAAD;GACE,GAAI,UAAU,mBAAmB;GACjC,KAAK,EAAE,MAAM,MAAM;GACnB,gBAAgB,MAA0B,gBAAgB,OAAO,CAAC;EACnE,CAAA;EAEH,iBAAA,GAAA,kBAAA,IAAA,CAACA,cAAAA,KAAD;GAAK,KAAK;IAAE;IAAQ;IAAM;IAAU;GAAQ;GAAG,GAAI,UAAU,YAAY;aACtE,OAAO,oBAAoB,aAAa,gBAAgB,KAAK,IAAI,MAAM;EACrE,CAAA;EACJ,qBACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,cAAAA,KAAD;GACE,GAAI,UAAU,mBAAmB;GACjC,KAAK,EAAE,MAAM,SAAS;GACtB,gBAAgB,MAA0B,gBAAgB,UAAU,CAAC;EACtE,CAAA;CAEH,EAAA,CAAA;CAGJ,MAAM,YAAY;EAChB,GAAG,UAAU,OAAO;EACpB,iBAAiB,MAAM;EACvB;EACA,OAAO,MAAM;EACb,KAAK,CACH;GACE;GACA;GACA;GACA,UAAU;GACV,gBAAgB;GAChB,QAAQ,SAAS;GACjB,UAAU;GACV,WAAW;EACb,GACA,GACF;EACA,GAAG;EACH,WAAW,aAAa,SAAS;EACjC,UAAU,SAAS,WAAW,KAAK;EACnC,aAAa,SAAS,WAAW,KAAA,IAAY;EAC7C,WAAW,SAAS,WAAW,KAAA,IAAY;EAC3C,SAAS,SAAS,WAAW,KAAA,IAAY,OAAO;EAChD,UAAU;CACZ;CAEA,IAAI,OAAO,gBAAgB,YACzB,OAAO,YAAY,OAAO,SAAS;CAGrC,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,gBAAD,EAAgB,GAAI,UAAY,CAAA;AACzC,CAAC;AAED,cAAc,cAAc;AAC5B,cAAc,UAAUC,6BAAAA;AACxB,cAAc,eAAe"}