{
  "version": 3,
  "sources": ["../../../src/date-time/date/index.tsx"],
  "sourcesContent": ["/**\n * External dependencies\n */\nimport { isSameDay, subMonths, addMonths, isEqual, addDays, subDays, subWeeks, addWeeks, isSameMonth } from 'date-fns';\n/**\n * WordPress dependencies\n */\nimport { __, _n, sprintf, isRTL } from '@wordpress/i18n';\nimport { arrowLeft, arrowRight } from '@wordpress/icons';\nimport { dateI18n, date as formatDate, getSettings } from '@wordpress/date';\nimport { useState, useRef, useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { useLilius } from './use-lilius';\nimport { Wrapper, Navigator, ViewPreviousMonthButton, ViewNextMonthButton, NavigatorHeading, Calendar, DayOfWeek, DayButton } from './styles';\nimport { inputToDate, setInConfiguredTimezone, startOfDayInConfiguredTimezone } from '../utils';\nimport { TIMEZONELESS_FORMAT } from '../constants';\n\n/**\n * DatePicker is a React component that renders a calendar for date selection.\n *\n * ```jsx\n * import { DatePicker } from '@wordpress/components';\n * import { useState } from '@wordpress/element';\n *\n * const MyDatePicker = () => {\n *   const [ date, setDate ] = useState( new Date() );\n *\n *   return (\n *     <DatePicker\n *       currentDate={ date }\n *       onChange={ ( newDate ) => setDate( newDate ) }\n *     />\n *   );\n * };\n * ```\n */\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function DatePicker({\n  currentDate,\n  onChange,\n  events = [],\n  isInvalidDate,\n  onMonthPreviewed,\n  startOfWeek: weekStartsOn = 0\n}) {\n  const date = inputToDate(currentDate ?? new Date());\n  const {\n    calendar,\n    viewing,\n    setSelected,\n    setViewing,\n    isSelected,\n    viewPreviousMonth,\n    viewNextMonth\n  } = useLilius({\n    selected: [startOfDayInConfiguredTimezone(date)],\n    viewing: startOfDayInConfiguredTimezone(date),\n    weekStartsOn\n  });\n\n  // Used to implement a roving tab index. Tracks the day that receives focus\n  // when the user tabs into the calendar.\n  const [focusable, setFocusable] = useState(startOfDayInConfiguredTimezone(date));\n\n  // Allows us to only programmatically focus() a day when focus was already\n  // within the calendar. This stops us stealing focus from e.g. a TimePicker\n  // input.\n  const [isFocusWithinCalendar, setIsFocusWithinCalendar] = useState(false);\n\n  // Update internal state when currentDate prop changes.\n  const [prevCurrentDate, setPrevCurrentDate] = useState(currentDate);\n  if (currentDate !== prevCurrentDate) {\n    setPrevCurrentDate(currentDate);\n    setSelected([startOfDayInConfiguredTimezone(date)]);\n    setViewing(startOfDayInConfiguredTimezone(date));\n    setFocusable(startOfDayInConfiguredTimezone(date));\n  }\n  return /*#__PURE__*/_jsxs(Wrapper, {\n    className: \"components-datetime__date\",\n    role: \"application\",\n    \"aria-label\": __('Calendar'),\n    children: [/*#__PURE__*/_jsxs(Navigator, {\n      children: [/*#__PURE__*/_jsx(ViewPreviousMonthButton, {\n        icon: isRTL() ? arrowRight : arrowLeft,\n        variant: \"tertiary\",\n        \"aria-label\": __('View previous month'),\n        onClick: () => {\n          viewPreviousMonth();\n          setFocusable(subMonths(focusable, 1));\n          const prevMonth = subMonths(viewing, 1);\n          onMonthPreviewed?.(dateI18n(TIMEZONELESS_FORMAT, prevMonth, -prevMonth.getTimezoneOffset()));\n        },\n        size: \"compact\"\n      }), /*#__PURE__*/_jsxs(NavigatorHeading, {\n        level: 3,\n        children: [/*#__PURE__*/_jsx(\"strong\", {\n          children: dateI18n('F', viewing, -viewing.getTimezoneOffset())\n        }), ' ', dateI18n('Y', viewing, -viewing.getTimezoneOffset())]\n      }), /*#__PURE__*/_jsx(ViewNextMonthButton, {\n        icon: isRTL() ? arrowLeft : arrowRight,\n        variant: \"tertiary\",\n        \"aria-label\": __('View next month'),\n        onClick: () => {\n          viewNextMonth();\n          setFocusable(addMonths(focusable, 1));\n          const nextMonth = addMonths(viewing, 1);\n          onMonthPreviewed?.(dateI18n(TIMEZONELESS_FORMAT, nextMonth, -nextMonth.getTimezoneOffset()));\n        },\n        size: \"compact\"\n      })]\n    }), /*#__PURE__*/_jsxs(Calendar, {\n      onFocus: () => setIsFocusWithinCalendar(true),\n      onBlur: () => setIsFocusWithinCalendar(false),\n      children: [calendar[0][0].map(day => /*#__PURE__*/_jsx(DayOfWeek, {\n        children: dateI18n('D', day, -day.getTimezoneOffset())\n      }, day.toString())), calendar[0].map(week => week.map((day, index) => {\n        if (!isSameMonth(day, viewing)) {\n          return null;\n        }\n        return /*#__PURE__*/_jsx(Day, {\n          day: day,\n          column: index + 1,\n          isSelected: isSelected(day),\n          isFocusable: isEqual(day, focusable),\n          isFocusAllowed: isFocusWithinCalendar,\n          isToday: isSameDay(day, startOfDayInConfiguredTimezone(new Date())),\n          isInvalid: isInvalidDate ? isInvalidDate(day) : false,\n          numEvents: events.filter(event => isSameDay(event.date, day)).length,\n          onClick: () => {\n            setSelected([day]);\n            setFocusable(day);\n            const newDate = setInConfiguredTimezone(date, {\n              year: day.getFullYear(),\n              month: day.getMonth(),\n              date: day.getDate()\n            });\n            onChange?.(formatDate(TIMEZONELESS_FORMAT, newDate));\n          },\n          onKeyDown: event => {\n            let nextFocusable;\n            if (event.key === 'ArrowLeft') {\n              nextFocusable = addDays(day, isRTL() ? 1 : -1);\n            }\n            if (event.key === 'ArrowRight') {\n              nextFocusable = addDays(day, isRTL() ? -1 : 1);\n            }\n            if (event.key === 'ArrowUp') {\n              nextFocusable = subWeeks(day, 1);\n            }\n            if (event.key === 'ArrowDown') {\n              nextFocusable = addWeeks(day, 1);\n            }\n            if (event.key === 'PageUp') {\n              nextFocusable = subMonths(day, 1);\n            }\n            if (event.key === 'PageDown') {\n              nextFocusable = addMonths(day, 1);\n            }\n            if (event.key === 'Home') {\n              const dayOfWeek = day.getDay();\n              const daysToSubtract = (dayOfWeek - weekStartsOn + 7) % 7;\n              nextFocusable = subDays(day, daysToSubtract);\n            }\n            if (event.key === 'End') {\n              const dayOfWeek = day.getDay();\n              const daysToAdd = (weekStartsOn + 6 - dayOfWeek) % 7;\n              nextFocusable = addDays(day, daysToAdd);\n            }\n            if (nextFocusable) {\n              event.preventDefault();\n              setFocusable(nextFocusable);\n              if (!isSameMonth(nextFocusable, viewing)) {\n                setViewing(nextFocusable);\n                onMonthPreviewed?.(dateI18n(TIMEZONELESS_FORMAT, nextFocusable, -nextFocusable.getTimezoneOffset()));\n              }\n            }\n          }\n        }, day.toString());\n      }))]\n    })]\n  });\n}\nfunction Day({\n  day,\n  column,\n  isSelected,\n  isFocusable,\n  isFocusAllowed,\n  isToday,\n  isInvalid,\n  numEvents,\n  onClick,\n  onKeyDown\n}) {\n  const ref = useRef(null);\n\n  // Focus the day when it becomes focusable, e.g. because an arrow key is\n  // pressed. Only do this if focus is allowed - this stops us stealing focus\n  // from e.g. a TimePicker input.\n  useEffect(() => {\n    if (ref.current && isFocusable && isFocusAllowed) {\n      ref.current.focus();\n    }\n    // isFocusAllowed is not a dep as there is no point calling focus() on\n    // an already focused element.\n  }, [isFocusable]);\n  return /*#__PURE__*/_jsx(DayButton, {\n    __next40pxDefaultSize: true,\n    ref: ref,\n    className: \"components-datetime__date__day\" // Unused, for backwards compatibility.\n    ,\n    disabled: isInvalid,\n    tabIndex: isFocusable ? 0 : -1,\n    \"aria-label\": getDayLabel(day, isSelected, isToday, numEvents),\n    column: column,\n    isSelected: isSelected,\n    isToday: isToday,\n    hasEvents: numEvents > 0,\n    onClick: onClick,\n    onKeyDown: onKeyDown,\n    children: dateI18n('j', day, -day.getTimezoneOffset())\n  });\n}\nfunction getDayLabel(date, isSelected, isToday, numEvents) {\n  const {\n    formats\n  } = getSettings();\n  const localizedDate = dateI18n(formats.date, date, -date.getTimezoneOffset());\n  const parts = [localizedDate];\n  if (isSelected) {\n    parts.push(__('Selected'));\n  }\n  if (isToday) {\n    parts.push(__('Today'));\n  }\n  if (numEvents > 0) {\n    parts.push(sprintf(\n    // translators: %d: Number of events on the calendar date.\n    _n('There is %d event', 'There are %d events', numEvents), numEvents));\n  }\n  return parts.join('. ');\n}\nexport default DatePicker;"],
  "mappings": "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",
  "names": []
}
