{"version":3,"file":"calendar.mjs","names":[],"sources":["../../../src/base-ui/DatePicker/calendar.ts"],"sourcesContent":["import dayjs from 'dayjs';\n\nexport type CalendarMode = 'date' | 'month' | 'year';\n\nexport interface DateBounds {\n  disabledDate?: (date: Date) => boolean;\n  max?: Date;\n  min?: Date;\n}\n\nexport const DEFAULT_FORMAT: Record<CalendarMode, string> = {\n  date: 'MMM D, YYYY',\n  month: 'MMMM YYYY',\n  year: 'YYYY',\n};\n\nexport const getWeekStart = (): number => {\n  const locales = (dayjs as unknown as { Ls: Record<string, { weekStart?: number }> }).Ls;\n  return locales[dayjs.locale()]?.weekStart ?? 0;\n};\n\nconst offsetFromWeekStart = (date: Date, weekStart: number) =>\n  (dayjs(date).day() - weekStart + 7) % 7;\n\nexport const buildMonthGrid = (month: Date, weekStart = getWeekStart()): Date[] => {\n  const first = dayjs(month).startOf('month');\n  const start = first.subtract(offsetFromWeekStart(first.toDate(), weekStart), 'day');\n  return Array.from({ length: 42 }, (_, index) => start.add(index, 'day').toDate());\n};\n\nexport const getWeekdayLabels = (weekStart = getWeekStart()): string[] =>\n  Array.from({ length: 7 }, (_, index) =>\n    dayjs()\n      .day((weekStart + index) % 7)\n      .format('dd'),\n  );\n\nexport const isSameDay = (a?: Date | null, b?: Date | null) =>\n  !!a && !!b && dayjs(a).isSame(b, 'day');\n\nexport const isDayDisabled = (date: Date, { disabledDate, max, min }: DateBounds) =>\n  (!!min && dayjs(date).isBefore(min, 'day')) ||\n  (!!max && dayjs(date).isAfter(max, 'day')) ||\n  !!disabledDate?.(date);\n\nexport const isMonthDisabled = (month: Date, { max, min }: DateBounds) =>\n  (!!min && dayjs(month).isBefore(min, 'month')) || (!!max && dayjs(month).isAfter(max, 'month'));\n\nexport const isYearDisabled = (year: Date, { max, min }: DateBounds) =>\n  (!!min && dayjs(year).isBefore(min, 'year')) || (!!max && dayjs(year).isAfter(max, 'year'));\n\nexport const moveDayFocus = (date: Date, key: string, weekStart = getWeekStart()): Date | null => {\n  const current = dayjs(date);\n  const offset = offsetFromWeekStart(date, weekStart);\n  switch (key) {\n    case 'ArrowLeft': {\n      return current.subtract(1, 'day').toDate();\n    }\n    case 'ArrowRight': {\n      return current.add(1, 'day').toDate();\n    }\n    case 'ArrowUp': {\n      return current.subtract(7, 'day').toDate();\n    }\n    case 'ArrowDown': {\n      return current.add(7, 'day').toDate();\n    }\n    case 'PageUp': {\n      return current.subtract(1, 'month').toDate();\n    }\n    case 'PageDown': {\n      return current.add(1, 'month').toDate();\n    }\n    case 'Home': {\n      return current.subtract(offset, 'day').toDate();\n    }\n    case 'End': {\n      return current.add(6 - offset, 'day').toDate();\n    }\n    default: {\n      return null;\n    }\n  }\n};\n\nexport const orderRange = (a: Date, b: Date): [Date, Date] =>\n  dayjs(a).isAfter(b, 'day') ? [b, a] : [a, b];\n\nexport const clampToBounds = (date: Date, { max, min }: DateBounds): Date => {\n  if (min && dayjs(date).isBefore(min, 'day')) return min;\n  if (max && dayjs(date).isAfter(max, 'day')) return max;\n  return date;\n};\n"],"mappings":"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"}