{"version":3,"file":"index.cjs","names":["Calendar","ChevronDown","useTheme","autoUpdate","useMultipleRefs","useLayoutContext"],"sources":["../../../src/components/DatePicker/helpers/context/DatePickerContext.tsx","../../../src/components/DatePicker/helpers/utils/helperFn.tsx","../../../src/components/DatePicker/helpers/components/DatePickerRenderer.tsx","../../../src/components/DatePicker/helpers/components/FloatingDatePickerRenderer.tsx","../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { DateRange } from \"react-day-picker\";\n\ninterface DatePickerContextType {\n  selectedDate: Date | undefined;\n  selectedRange: DateRange | undefined;\n  isOpen: boolean;\n  mode: \"single\" | \"range\";\n  botType: \"mobile\" | \"fullscreen\" | \"tray\" | \"copilot\";\n\n  setSelectedDate: (date: Date | undefined) => void;\n  setSelectedRange: (range: DateRange | undefined) => void;\n  setIsOpen: (isOpen: boolean) => void;\n}\n\nconst defaultContext: DatePickerContextType = {\n  selectedDate: undefined,\n  selectedRange: { from: undefined, to: undefined },\n  isOpen: false,\n  mode: \"single\",\n  botType: \"fullscreen\",\n\n  setSelectedDate: (_date: Date | undefined) => {},\n  setSelectedRange: (_range: DateRange | undefined) => {},\n  setIsOpen: (_isOpen: boolean) => {},\n};\n\nconst DatePickerContext = createContext<DatePickerContextType>(defaultContext);\n\nexport const useDatePicker = () => {\n  const context = useContext(DatePickerContext);\n  if (!context) {\n    throw new Error(\"useDatePicker must be used within a DatePickerProvider\");\n  }\n  return context;\n};\n\ninterface DatePickerProviderProps {\n  children: React.ReactNode;\n  // DatePicker State needed from parent\n  selectedDateFromParent: Date | undefined;\n  selectedRangeFromParent: DateRange | undefined;\n  mode: \"single\" | \"range\";\n  botType: \"mobile\" | \"fullscreen\" | \"tray\" | \"copilot\";\n\n  setSelectedDateFromParent: (date: Date | undefined) => void;\n  setSelectedRangeFromParent: (range: DateRange | undefined) => void;\n  isOpenFromParent: boolean;\n  setIsOpenFromParent: (isOpen: boolean) => void;\n}\n\nexport const DatePickerProvider: React.FC<DatePickerProviderProps> = ({\n  children,\n\n  selectedDateFromParent,\n  selectedRangeFromParent,\n  setSelectedDateFromParent,\n  setSelectedRangeFromParent,\n  isOpenFromParent,\n  setIsOpenFromParent,\n\n  mode,\n  botType,\n}) => {\n  return (\n    <DatePickerContext.Provider\n      value={{\n        // DatePicker State needed from parent\n        selectedDate: selectedDateFromParent,\n        selectedRange: selectedRangeFromParent,\n        setSelectedDate: setSelectedDateFromParent,\n        setSelectedRange: setSelectedRangeFromParent,\n\n        mode,\n\n        isOpen: isOpenFromParent,\n        setIsOpen: setIsOpenFromParent,\n\n        botType,\n      }}\n    >\n      {children}\n    </DatePickerContext.Provider>\n  );\n};\n\nexport default DatePickerContext;\n","import { format } from \"date-fns\";\nimport { DateRange } from \"react-day-picker\";\n\nexport const getMonthName = (monthNumber: number): string => {\n  switch (monthNumber) {\n    case 0:\n      return \"January\";\n    case 1:\n      return \"February\";\n    case 2:\n      return \"March\";\n    case 3:\n      return \"April\";\n    case 4:\n      return \"May\";\n    case 5:\n      return \"June\";\n    case 6:\n      return \"July\";\n    case 7:\n      return \"August\";\n    case 8:\n      return \"September\";\n    case 9:\n      return \"October\";\n    case 10:\n      return \"November\";\n    case 11:\n      return \"December\";\n    default:\n      return \"Invalid Month\";\n  }\n};\n\nexport const getMonthNumber = (monthName: string): number => {\n  switch (monthName) {\n    case \"January\":\n      return 0;\n    case \"February\":\n      return 1;\n    case \"March\":\n      return 2;\n    case \"April\":\n      return 3;\n    case \"May\":\n      return 4;\n    case \"June\":\n      return 5;\n    case \"July\":\n      return 6;\n    case \"August\":\n      return 7;\n    case \"September\":\n      return 8;\n    case \"October\":\n      return 9;\n    case \"November\":\n      return 10;\n    case \"December\":\n      return 11;\n    default:\n      return -1;\n  }\n};\n\nexport const formatDateRange = (range: DateRange | undefined): string => {\n  if (!range) return \"Select a range\";\n\n  const { from, to } = range;\n\n  if (!from) return \"Select a range\";\n\n  if (!to) {\n    return format(from, \"MMM d, yyyy\");\n  }\n\n  if (from.toDateString() === to.toDateString()) {\n    return format(from, \"MMM d, yyyy\");\n  }\n\n  return `${format(from, \"MMM d, yyyy\")} - ${format(to, \"MMM d, yyyy\")}`;\n};\n\nexport const formatSingleDate = (date: Date | undefined): string => {\n  if (!date) return \"Select a date\";\n  return format(date, \"MMM d, yyyy\");\n};\n","import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Calendar } from \"../../../Calendar\";\nimport { useDatePicker } from \"../context/DatePickerContext\";\n\nconst DatepickerRenderer = forwardRef<\n  HTMLDivElement,\n  { className?: string; style?: React.CSSProperties }\n>(({ className, style }, ref) => {\n  const { selectedDate, selectedRange, mode, setSelectedDate, setSelectedRange } = useDatePicker();\n\n  if (mode === \"single\") {\n    return (\n      <div\n        ref={ref}\n        className={clsx(\"openui-date-picker-renderer-single-mode\", className)}\n        style={style}\n      >\n        <Calendar\n          mode=\"single\"\n          selected={selectedDate}\n          onSelect={setSelectedDate}\n          startMonth={new Date(1900, 0)}\n          endMonth={new Date(2100, 11)}\n        />\n      </div>\n    );\n  }\n\n  return (\n    <div\n      ref={ref}\n      className={clsx(\"openui-date-picker-renderer-range-mode\", className)}\n      style={style}\n    >\n      <Calendar\n        mode=\"range\"\n        selected={selectedRange}\n        onSelect={setSelectedRange}\n        startMonth={new Date(1900, 0)}\n        endMonth={new Date(2100, 11)}\n      />\n    </div>\n  );\n});\n\nexport { DatepickerRenderer };\n","import { autoUpdate, flip, offset, useFloating } from \"@floating-ui/react-dom\";\nimport clsx from \"clsx\";\nimport { ChevronDown } from \"lucide-react\";\nimport { forwardRef, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useMultipleRefs } from \"../../../../hooks/useMultipleRefs\";\nimport { useTheme } from \"../../../ThemeProvider\";\nimport { useDatePicker } from \"../context/DatePickerContext\";\nimport { formatDateRange, formatSingleDate } from \"../utils/helperFn\";\nimport { DatepickerRenderer } from \"./DatePickerRenderer\";\n\nconst FloatingDateInput = () => {\n  const { mode, selectedDate, selectedRange, isOpen, setIsOpen } = useDatePicker();\n  const hasSelectedDate =\n    mode === \"single\"\n      ? !!selectedDate\n      : !!(selectedRange && selectedRange.from && selectedRange.to);\n\n  return (\n    <div\n      className={clsx(\"openui-date-picker-renderer-floating-input-container\", {\n        \"openui-date-picker-renderer-floating-input-container-open\": isOpen,\n        \"openui-date-picker-renderer-floating-input-container-not-open\": !isOpen,\n        \"openui-date-picker-renderer-floating-input-container-has-no-selected-date\":\n          !hasSelectedDate,\n      })}\n      onClick={(e) => {\n        e.stopPropagation();\n        setIsOpen(!isOpen);\n      }}\n    >\n      <span className=\"openui-date-picker-renderer-floating-input-container-text\">\n        {mode === \"single\" ? formatSingleDate(selectedDate) : formatDateRange(selectedRange)}\n      </span>\n      <ChevronDown\n        size={16}\n        className={clsx({ \"openui-date-picker-renderer-floating-input-container-icon\": isOpen })}\n      />\n    </div>\n  );\n};\n\nconst FloatingDatePicker = forwardRef<HTMLDivElement>((_, ref) => {\n  const { isOpen } = useDatePicker();\n  const menuPositionDivRef = useRef<HTMLDivElement>(null);\n  const { portalThemeClassName } = useTheme();\n\n  const {\n    refs: { setFloating, setReference },\n    floatingStyles,\n  } = useFloating({\n    strategy: \"absolute\",\n    placement: \"bottom-start\",\n    whileElementsMounted: autoUpdate,\n    middleware: [offset(5), flip()],\n  });\n\n  const menuPositionDivRefs = useMultipleRefs(setReference, menuPositionDivRef);\n  const floatingRef = useMultipleRefs(setFloating, ref);\n\n  if (!isOpen) {\n    return null;\n  }\n\n  return (\n    <>\n      <div\n        ref={menuPositionDivRefs}\n        className={clsx(\"openui-date-picker-renderer-floating-reference\")}\n      />\n      {createPortal(\n        <div\n          ref={floatingRef}\n          style={{ ...floatingStyles, width: \"fit-content\" }}\n          className={clsx(\"openui-date-picker-renderer-floating-content\", portalThemeClassName)}\n        >\n          <div className=\"openui-date-picker-renderer-floating-menu\">\n            <DatepickerRenderer />\n          </div>\n        </div>,\n        document.body,\n      )}\n    </>\n  );\n});\n\nexport const FloatingDatePickerRenderer = ({\n  className,\n  style,\n}: {\n  className?: string;\n  style?: React.CSSProperties;\n}) => {\n  const { isOpen, setIsOpen } = useDatePicker();\n  const menuRef = useRef<HTMLDivElement>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (!isOpen) return;\n\n    const handleInteraction = (e: MouseEvent | TouchEvent) => {\n      const targetNode = e.target as Node;\n      if (menuRef.current?.contains(targetNode) || containerRef.current?.contains(targetNode)) {\n        return;\n      }\n      setIsOpen(false);\n    };\n\n    document.body.addEventListener(\"mousedown\", handleInteraction);\n    document.body.addEventListener(\"touchstart\", handleInteraction);\n\n    return () => {\n      document.body.removeEventListener(\"mousedown\", handleInteraction);\n      document.body.removeEventListener(\"touchstart\", handleInteraction);\n    };\n  }, [isOpen, setIsOpen]);\n\n  return (\n    <div\n      ref={containerRef}\n      className={clsx(\"openui-date-picker-renderer-floating-container\", className)}\n      style={style}\n    >\n      <FloatingDateInput />\n      <FloatingDatePicker ref={menuRef} />\n    </div>\n  );\n};\n","import { useState } from \"react\";\nimport { DateRange } from \"react-day-picker\";\nimport { useLayoutContext } from \"../../context/LayoutContext\";\nimport { FloatingDatePickerRenderer } from \"./helpers/components/FloatingDatePickerRenderer\";\nimport { DatePickerProvider } from \"./helpers/context/DatePickerContext\";\n\nexport interface DatePickerProps {\n  mode?: \"single\" | \"range\";\n  selectedSingleDate?: Date;\n  selectedRangeDates?: DateRange;\n  setSelectedSingleDate?: (date?: Date) => void;\n  setSelectedRangeDates?: (range?: DateRange) => void;\n  isOpen?: boolean;\n  setIsOpen?: (isOpen: boolean) => void;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nconst DatePicker = (props: DatePickerProps) => {\n  const { layout } = useLayoutContext();\n\n  const {\n    mode = \"single\",\n    selectedSingleDate,\n    selectedRangeDates,\n    setSelectedSingleDate,\n    setSelectedRangeDates,\n    isOpen,\n    setIsOpen,\n    className,\n    style,\n  } = props;\n\n  const [internalSelectedDate, setInternalSelectedDate] = useState<Date | undefined>(\n    selectedSingleDate,\n  );\n  const [internalSelectedRange, setInternalSelectedRange] = useState<DateRange | undefined>(\n    selectedRangeDates,\n  );\n  const [internalIsOpen, setInternalIsOpen] = useState(isOpen ?? false);\n\n  // this derived setter state is used to make this component more flexible\n  // it allows the user to pass in a setter function from the parent component\n  // if the parent component does not pass in a setter function, the internal setter state is used\n  // this allows the user to pass in a setter function from the parent component, but still have the internal state be set\n\n  // this design decision closely follow\n\n  const selectedDateHandler = (selectedDate?: Date) => {\n    if (selectedSingleDate) {\n      setSelectedSingleDate?.(selectedDate);\n      return;\n    }\n\n    setSelectedSingleDate?.(selectedDate);\n    setInternalSelectedDate(selectedDate);\n  };\n\n  const selectedRangeHandler = (selectedRange?: DateRange) => {\n    if (selectedRangeDates) {\n      setSelectedRangeDates?.(selectedRange);\n      return;\n    }\n\n    setSelectedRangeDates?.(selectedRange);\n    setInternalSelectedRange(selectedRange);\n  };\n\n  return (\n    <DatePickerProvider\n      mode={mode}\n      botType={layout}\n      selectedDateFromParent={selectedSingleDate ?? internalSelectedDate}\n      selectedRangeFromParent={selectedRangeDates ?? internalSelectedRange}\n      setSelectedDateFromParent={selectedDateHandler}\n      setSelectedRangeFromParent={selectedRangeHandler}\n      isOpenFromParent={isOpen ?? internalIsOpen}\n      setIsOpenFromParent={setIsOpen ?? setInternalIsOpen}\n    >\n      <FloatingDatePickerRenderer className={className} style={style} />\n    </DatePickerProvider>\n  );\n};\n\nexport { DatePicker };\n"],"mappings":"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"}