react-day-picker 10.0.0-next.5 → 10.0.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.
Files changed (64) hide show
  1. package/README.md +10 -5
  2. package/dist/cjs/DayPicker.js +89 -88
  3. package/dist/cjs/classes/DateLib.d.ts +1 -0
  4. package/dist/cjs/components/CaptionLabel.d.ts +1 -0
  5. package/dist/cjs/components/Chevron.d.ts +1 -0
  6. package/dist/cjs/components/Day.d.ts +1 -0
  7. package/dist/cjs/components/DayButton.d.ts +1 -0
  8. package/dist/cjs/components/Dropdown.d.ts +1 -0
  9. package/dist/cjs/components/DropdownNav.d.ts +1 -0
  10. package/dist/cjs/components/Footer.d.ts +1 -0
  11. package/dist/cjs/components/Month.d.ts +1 -0
  12. package/dist/cjs/components/MonthCaption.d.ts +1 -0
  13. package/dist/cjs/components/MonthGrid.d.ts +1 -0
  14. package/dist/cjs/components/Months.d.ts +1 -0
  15. package/dist/cjs/components/Nav.d.ts +1 -0
  16. package/dist/cjs/components/NextMonthButton.d.ts +1 -0
  17. package/dist/cjs/components/Option.d.ts +1 -0
  18. package/dist/cjs/components/PreviousMonthButton.d.ts +1 -0
  19. package/dist/cjs/components/Root.d.ts +1 -0
  20. package/dist/cjs/components/Select.d.ts +1 -0
  21. package/dist/cjs/components/Week.d.ts +1 -0
  22. package/dist/cjs/components/WeekNumber.d.ts +1 -0
  23. package/dist/cjs/components/WeekNumberHeader.d.ts +1 -0
  24. package/dist/cjs/components/Weekday.d.ts +1 -0
  25. package/dist/cjs/components/Weekdays.d.ts +1 -0
  26. package/dist/cjs/components/Weeks.d.ts +1 -0
  27. package/dist/cjs/locale.d.ts +0 -1
  28. package/dist/cjs/locale.js +2 -4
  29. package/dist/cjs/types/props.d.ts +2 -1
  30. package/dist/cjs/types/selection.d.ts +7 -0
  31. package/dist/esm/DayPicker.js +89 -88
  32. package/dist/esm/classes/DateLib.d.ts +1 -0
  33. package/dist/esm/components/CaptionLabel.d.ts +1 -0
  34. package/dist/esm/components/Chevron.d.ts +1 -0
  35. package/dist/esm/components/Day.d.ts +1 -0
  36. package/dist/esm/components/DayButton.d.ts +1 -0
  37. package/dist/esm/components/Dropdown.d.ts +1 -0
  38. package/dist/esm/components/DropdownNav.d.ts +1 -0
  39. package/dist/esm/components/Footer.d.ts +1 -0
  40. package/dist/esm/components/Month.d.ts +1 -0
  41. package/dist/esm/components/MonthCaption.d.ts +1 -0
  42. package/dist/esm/components/MonthGrid.d.ts +1 -0
  43. package/dist/esm/components/Months.d.ts +1 -0
  44. package/dist/esm/components/Nav.d.ts +1 -0
  45. package/dist/esm/components/NextMonthButton.d.ts +1 -0
  46. package/dist/esm/components/Option.d.ts +1 -0
  47. package/dist/esm/components/PreviousMonthButton.d.ts +1 -0
  48. package/dist/esm/components/Root.d.ts +1 -0
  49. package/dist/esm/components/Select.d.ts +1 -0
  50. package/dist/esm/components/Week.d.ts +1 -0
  51. package/dist/esm/components/WeekNumber.d.ts +1 -0
  52. package/dist/esm/components/WeekNumberHeader.d.ts +1 -0
  53. package/dist/esm/components/Weekday.d.ts +1 -0
  54. package/dist/esm/components/Weekdays.d.ts +1 -0
  55. package/dist/esm/components/Weeks.d.ts +1 -0
  56. package/dist/esm/locale.d.ts +0 -1
  57. package/dist/esm/locale.js +0 -1
  58. package/dist/esm/types/props.d.ts +2 -1
  59. package/dist/esm/types/selection.d.ts +7 -0
  60. package/package.json +1 -1
  61. package/dist/cjs/locale/am-ET.d.ts +0 -7
  62. package/dist/cjs/locale/am-ET.js +0 -131
  63. package/dist/esm/locale/am-ET.d.ts +0 -7
  64. package/dist/esm/locale/am-ET.js +0 -128
package/README.md CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  DayPicker is a [React](https://react.dev) component for creating date pickers, calendars, and date inputs for web applications.
4
4
 
5
+ You are reading the README for `react-day-picker`, the legacy DayPicker package name. It remains available for compatibility and exposes the same DayPicker API in v10, but new projects should use `@daypicker/react`.
6
+
5
7
  ## Documentation
6
8
 
7
- See **[daypicker.dev](https://daypicker.dev)** for guides, examples and API reference, or read [the docs in the repository](https://github.com/gpbl/react-day-picker/blob/main/apps/website/docs/start.mdx).
9
+ See **[daypicker.dev](https://daypicker.dev)** for guides, examples, and API reference, or read [the v10 docs in the repository](https://github.com/gpbl/react-day-picker/blob/main/apps/website/versioned_docs/version-next/start.mdx).
8
10
 
9
11
  <picture>
10
12
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gpbl/react-day-picker/main/apps/website/static/img/screenshot-dark.png" />
@@ -27,15 +29,16 @@ DayPicker is written in TypeScript and compiled to CommonJS and ESM. It relies o
27
29
 
28
30
  ## Installation
29
31
 
32
+ Install the legacy DayPicker package name:
33
+
30
34
  ```bash
31
- npm install react-day-picker
35
+ npm install react-day-picker@next
32
36
  ```
33
37
 
34
- If you are trying the v10 prereleases with one of the alternative calendar
35
- integrations, install both packages together. For example:
38
+ For new projects, prefer the `@daypicker/react` package name:
36
39
 
37
40
  ```bash
38
- npm install react-day-picker@next @daypicker/persian@next
41
+ npm install @daypicker/react@next
39
42
  ```
40
43
 
41
44
  <a href="https://www.npmjs.com/package/react-day-picker"><img src="https://img.shields.io/npm/v/react-day-picker" alt="npm version"/></a> <img src="https://img.shields.io/npm/dm/react-day-picker.svg" alt="npm downloads"/> <img src="https://img.shields.io/bundlephobia/minzip/react-day-picker" alt="Min gzipped size"/>
@@ -43,6 +46,8 @@ npm install react-day-picker@next @daypicker/persian@next
43
46
  ## Example
44
47
 
45
48
  ```tsx
49
+ import { useState } from "react";
50
+
46
51
  import { DayPicker } from "react-day-picker";
47
52
  import "react-day-picker/style.css";
48
53
 
@@ -164,12 +164,8 @@ function DayPicker(initialProps) {
164
164
  props.labels,
165
165
  props.classNames,
166
166
  ]);
167
- if (!props.today || props.navLayout === undefined) {
168
- props = {
169
- ...props,
170
- today: props.today ?? dateLib.today(),
171
- navLayout: props.navLayout ?? "after",
172
- };
167
+ if (!props.today) {
168
+ props = { ...props, today: dateLib.today() };
173
169
  }
174
170
  const { captionLayout, mode, navLayout, numberOfMonths = 1, onDayBlur, onDayClick, onDayFocus, onDayKeyDown, onDayMouseEnter, onDayMouseLeave, onNextClick, onPrevClick, showWeekNumber, styles, } = props;
175
171
  const { formatCaption, formatDay, formatMonthDropdown, formatWeekNumber, formatWeekNumberHeader, formatWeekdayName, formatYearDropdown, } = formatters;
@@ -242,15 +238,15 @@ function DayPicker(initialProps) {
242
238
  const handleDayMouseLeave = (0, react_1.useCallback)((day, modifiers) => (e) => {
243
239
  onDayMouseLeave?.(day.date, modifiers, e);
244
240
  }, [onDayMouseLeave]);
245
- const handleMonthChange = (0, react_1.useCallback)((date) => (e) => {
241
+ const handleMonthChange = (0, react_1.useCallback)((date, monthOffset) => (e) => {
246
242
  const selectedMonth = Number(e.target.value);
247
243
  const month = dateLib.setMonth(dateLib.startOfMonth(date), selectedMonth);
248
- goToMonth(month);
244
+ goToMonth(dateLib.addMonths(month, -monthOffset));
249
245
  }, [dateLib, goToMonth]);
250
- const handleYearChange = (0, react_1.useCallback)((date) => (e) => {
246
+ const handleYearChange = (0, react_1.useCallback)((date, monthOffset) => (e) => {
251
247
  const selectedYear = Number(e.target.value);
252
248
  const month = dateLib.setYear(dateLib.startOfMonth(date), selectedYear);
253
- goToMonth(month);
249
+ goToMonth(dateLib.addMonths(month, -monthOffset));
254
250
  }, [dateLib, goToMonth]);
255
251
  const { className, style } = (0, react_1.useMemo)(() => ({
256
252
  className: [classNames[UI_js_1.UI.Root], props.className]
@@ -284,83 +280,88 @@ function DayPicker(initialProps) {
284
280
  };
285
281
  return (react_1.default.createElement(useDayPicker_js_1.dayPickerContext.Provider, { value: contextValue },
286
282
  react_1.default.createElement(components.Root, { rootRef: props.animate ? rootElRef : undefined, className: className, style: style, dir: props.dir, id: props.id, lang: props.lang ?? locale.code, nonce: props.nonce, title: props.title, role: props.role, "aria-label": props["aria-label"], "aria-labelledby": props["aria-labelledby"], ...dataAttributes },
287
- react_1.default.createElement(components.Months, { className: classNames[UI_js_1.UI.Months], style: styles?.[UI_js_1.UI.Months] }, months.map((calendarMonth, displayIndex) => {
288
- return (react_1.default.createElement(components.Month, { "data-animated-month": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Month], style: styles?.[UI_js_1.UI.Month],
289
- // biome-ignore lint/suspicious/noArrayIndexKey: breaks animation
290
- key: displayIndex, displayIndex: displayIndex, calendarMonth: calendarMonth },
291
- navLayout === "around" &&
292
- !props.hideNavigation &&
293
- displayIndex === 0 && (react_1.default.createElement(components.PreviousMonthButton, { type: "button", className: classNames[UI_js_1.UI.PreviousMonthButton], tabIndex: previousMonth ? undefined : -1, "aria-disabled": previousMonth ? undefined : true, "aria-label": labelPrevious(previousMonth), onClick: handlePreviousClick, "data-animated-button": props.animate ? "true" : undefined },
294
- react_1.default.createElement(components.Chevron, { disabled: previousMonth ? undefined : true, className: classNames[UI_js_1.UI.Chevron], orientation: props.dir === "rtl" ? "right" : "left" }))),
295
- react_1.default.createElement(components.MonthCaption, { "data-animated-caption": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.MonthCaption], style: styles?.[UI_js_1.UI.MonthCaption], calendarMonth: calendarMonth, displayIndex: displayIndex }, captionLayout?.startsWith("dropdown") ? (react_1.default.createElement(components.DropdownNav, { className: classNames[UI_js_1.UI.Dropdowns], style: styles?.[UI_js_1.UI.Dropdowns] },
296
- (() => {
297
- const monthControl = captionLayout === "dropdown" ||
298
- captionLayout === "dropdown-months" ? (react_1.default.createElement(components.MonthsDropdown, { key: "month", className: classNames[UI_js_1.UI.MonthsDropdown], "aria-label": labelMonthDropdown(), disabled: Boolean(props.disableNavigation), onChange: handleMonthChange(calendarMonth.date), options: (0, getMonthOptions_js_1.getMonthOptions)(calendarMonth.date, navStart, navEnd, formatters, dateLib), style: styles?.[UI_js_1.UI.Dropdown], value: dateLib.getMonth(calendarMonth.date) })) : (react_1.default.createElement("span", { key: "month" }, formatMonthDropdown(calendarMonth.date, dateLib)));
299
- const yearControl = captionLayout === "dropdown" ||
300
- captionLayout === "dropdown-years" ? (react_1.default.createElement(components.YearsDropdown, { key: "year", className: classNames[UI_js_1.UI.YearsDropdown], "aria-label": labelYearDropdown(dateLib.options), disabled: Boolean(props.disableNavigation), onChange: handleYearChange(calendarMonth.date), options: (0, getYearOptions_js_1.getYearOptions)(navStart, navEnd, formatters, dateLib, Boolean(props.reverseYears)), style: styles?.[UI_js_1.UI.Dropdown], value: dateLib.getYear(calendarMonth.date) })) : (react_1.default.createElement("span", { key: "year" }, formatYearDropdown(calendarMonth.date, dateLib)));
301
- const controls = dateLib.getMonthYearOrder() === "year-first"
302
- ? [yearControl, monthControl]
303
- : [monthControl, yearControl];
304
- return controls;
305
- })(),
306
- react_1.default.createElement("span", { role: "status", "aria-live": "polite", style: {
307
- border: 0,
308
- clip: "rect(0 0 0 0)",
309
- height: "1px",
310
- margin: "-1px",
311
- overflow: "hidden",
312
- padding: 0,
313
- position: "absolute",
314
- width: "1px",
315
- whiteSpace: "nowrap",
316
- wordWrap: "normal",
317
- } }, formatCaption(calendarMonth.date, dateLib.options, dateLib)))) : (react_1.default.createElement(components.CaptionLabel, { className: classNames[UI_js_1.UI.CaptionLabel], role: "status", "aria-live": "polite" }, formatCaption(calendarMonth.date, dateLib.options, dateLib)))),
318
- navLayout === "around" &&
319
- !props.hideNavigation &&
320
- displayIndex === numberOfMonths - 1 && (react_1.default.createElement(components.NextMonthButton, { type: "button", className: classNames[UI_js_1.UI.NextMonthButton], tabIndex: nextMonth ? undefined : -1, "aria-disabled": nextMonth ? undefined : true, "aria-label": labelNext(nextMonth), onClick: handleNextClick, "data-animated-button": props.animate ? "true" : undefined },
321
- react_1.default.createElement(components.Chevron, { disabled: nextMonth ? undefined : true, className: classNames[UI_js_1.UI.Chevron], orientation: props.dir === "rtl" ? "left" : "right" }))),
322
- displayIndex === numberOfMonths - 1 &&
323
- navLayout === "after" &&
324
- !props.hideNavigation && (react_1.default.createElement(components.Nav, { "data-animated-nav": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Nav], style: styles?.[UI_js_1.UI.Nav], "aria-label": labelNav(), onPreviousClick: handlePreviousClick, onNextClick: handleNextClick, previousMonth: previousMonth, nextMonth: nextMonth })),
325
- react_1.default.createElement(components.MonthGrid, { role: "grid", "aria-multiselectable": mode === "multiple" || mode === "range", "aria-label": labelGrid(calendarMonth.date, dateLib.options, dateLib) ||
326
- undefined, className: classNames[UI_js_1.UI.MonthGrid], style: styles?.[UI_js_1.UI.MonthGrid] },
327
- !props.hideWeekdays && (react_1.default.createElement(components.Weekdays, { "data-animated-weekdays": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Weekdays], style: styles?.[UI_js_1.UI.Weekdays] },
328
- showWeekNumber && (react_1.default.createElement(components.WeekNumberHeader, { "aria-label": labelWeekNumberHeader(dateLib.options), className: classNames[UI_js_1.UI.WeekNumberHeader], style: styles?.[UI_js_1.UI.WeekNumberHeader], scope: "col" }, formatWeekNumberHeader())),
329
- weekdays.map((weekday) => (react_1.default.createElement(components.Weekday, { "aria-label": labelWeekday(weekday, dateLib.options, dateLib), className: classNames[UI_js_1.UI.Weekday], key: String(weekday), style: styles?.[UI_js_1.UI.Weekday], scope: "col" }, formatWeekdayName(weekday, dateLib.options, dateLib)))))),
330
- react_1.default.createElement(components.Weeks, { "data-animated-weeks": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Weeks], style: styles?.[UI_js_1.UI.Weeks] }, calendarMonth.weeks.map((week) => {
331
- return (react_1.default.createElement(components.Week, { className: classNames[UI_js_1.UI.Week], key: week.weekNumber, style: styles?.[UI_js_1.UI.Week], week: week },
332
- showWeekNumber && (react_1.default.createElement(components.WeekNumber, { week: week, style: styles?.[UI_js_1.UI.WeekNumber], "aria-label": labelWeekNumber(week.weekNumber, {
333
- locale,
334
- }), className: classNames[UI_js_1.UI.WeekNumber], scope: "row", role: "rowheader" }, formatWeekNumber(week.weekNumber, dateLib))),
335
- week.days.map((day) => {
336
- const { date } = day;
337
- const modifiers = getModifiers(day);
338
- modifiers[UI_js_1.DayFlag.focused] =
339
- !modifiers.hidden &&
340
- Boolean(focused?.isEqualTo(day));
341
- modifiers[UI_js_1.SelectionState.selected] =
342
- isSelected?.(date) || modifiers.selected;
343
- if ((0, typeguards_js_1.isDateRange)(selectedValue)) {
344
- // add range modifiers
345
- const { from, to } = selectedValue;
346
- modifiers[UI_js_1.SelectionState.range_start] = Boolean(from && to && dateLib.isSameDay(date, from));
347
- modifiers[UI_js_1.SelectionState.range_end] = Boolean(from && to && dateLib.isSameDay(date, to));
348
- modifiers[UI_js_1.SelectionState.range_middle] =
349
- (0, rangeIncludesDate_js_1.rangeIncludesDate)(selectedValue, date, true, dateLib);
350
- }
351
- const style = (0, getStyleForModifiers_js_1.getStyleForModifiers)(modifiers, styles, props.modifiersStyles);
352
- const className = (0, getClassNamesForModifiers_js_1.getClassNamesForModifiers)(modifiers, classNames, props.modifiersClassNames);
353
- const ariaLabel = !isInteractive && !modifiers.hidden
354
- ? labelGridcell(date, modifiers, dateLib.options, dateLib)
355
- : undefined;
356
- return (react_1.default.createElement(components.Day, { key: `${day.isoDate}_${day.displayMonthId}`, day: day, modifiers: modifiers, className: className.join(" "), style: style, role: "gridcell", "aria-selected": modifiers.selected || undefined, "aria-label": ariaLabel, "data-day": day.isoDate, "data-month": day.outside ? day.dateMonthId : undefined, "data-selected": modifiers.selected || undefined, "data-disabled": modifiers.disabled || undefined, "data-hidden": modifiers.hidden || undefined, "data-outside": day.outside || undefined, "data-focused": modifiers.focused || undefined, "data-today": modifiers.today || undefined }, !modifiers.hidden && isInteractive ? (react_1.default.createElement(components.DayButton, { className: classNames[UI_js_1.UI.DayButton], style: styles?.[UI_js_1.UI.DayButton], type: "button", day: day, modifiers: modifiers, disabled: (!modifiers.focused &&
357
- modifiers.disabled) ||
358
- undefined, "aria-disabled": (modifiers.focused &&
359
- modifiers.disabled) ||
360
- undefined, tabIndex: isFocusTarget(day) ? 0 : -1, "aria-label": labelDayButton(date, modifiers, dateLib.options, dateLib), onClick: handleDayClick(day, modifiers), onBlur: handleDayBlur(day, modifiers), onFocus: handleDayFocus(day, modifiers), onKeyDown: handleDayKeyDown(day, modifiers), onMouseEnter: handleDayMouseEnter(day, modifiers), onMouseLeave: handleDayMouseLeave(day, modifiers) }, formatDay(date, dateLib.options, dateLib))) : (!modifiers.hidden &&
361
- formatDay(day.date, dateLib.options, dateLib))));
362
- })));
363
- })))));
364
- })),
283
+ react_1.default.createElement(components.Months, { className: classNames[UI_js_1.UI.Months], style: styles?.[UI_js_1.UI.Months] },
284
+ !props.hideNavigation && !navLayout && (react_1.default.createElement(components.Nav, { "data-animated-nav": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Nav], style: styles?.[UI_js_1.UI.Nav], "aria-label": labelNav(), onPreviousClick: handlePreviousClick, onNextClick: handleNextClick, previousMonth: previousMonth, nextMonth: nextMonth })),
285
+ months.map((calendarMonth, displayIndex) => {
286
+ const monthOffset = props.reverseMonths
287
+ ? months.length - 1 - displayIndex
288
+ : displayIndex;
289
+ return (react_1.default.createElement(components.Month, { "data-animated-month": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Month], style: styles?.[UI_js_1.UI.Month],
290
+ // biome-ignore lint/suspicious/noArrayIndexKey: breaks animation
291
+ key: displayIndex, displayIndex: displayIndex, calendarMonth: calendarMonth },
292
+ navLayout === "around" &&
293
+ !props.hideNavigation &&
294
+ displayIndex === 0 && (react_1.default.createElement(components.PreviousMonthButton, { type: "button", className: classNames[UI_js_1.UI.PreviousMonthButton], tabIndex: previousMonth ? undefined : -1, "aria-disabled": previousMonth ? undefined : true, "aria-label": labelPrevious(previousMonth), onClick: handlePreviousClick, "data-animated-button": props.animate ? "true" : undefined },
295
+ react_1.default.createElement(components.Chevron, { disabled: previousMonth ? undefined : true, className: classNames[UI_js_1.UI.Chevron], orientation: props.dir === "rtl" ? "right" : "left" }))),
296
+ react_1.default.createElement(components.MonthCaption, { "data-animated-caption": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.MonthCaption], style: styles?.[UI_js_1.UI.MonthCaption], calendarMonth: calendarMonth, displayIndex: displayIndex }, captionLayout?.startsWith("dropdown") ? (react_1.default.createElement(components.DropdownNav, { className: classNames[UI_js_1.UI.Dropdowns], style: styles?.[UI_js_1.UI.Dropdowns] },
297
+ (() => {
298
+ const monthControl = captionLayout === "dropdown" ||
299
+ captionLayout === "dropdown-months" ? (react_1.default.createElement(components.MonthsDropdown, { key: "month", className: classNames[UI_js_1.UI.MonthsDropdown], "aria-label": labelMonthDropdown(), disabled: Boolean(props.disableNavigation), onChange: handleMonthChange(calendarMonth.date, monthOffset), options: (0, getMonthOptions_js_1.getMonthOptions)(calendarMonth.date, navStart, navEnd, formatters, dateLib), style: styles?.[UI_js_1.UI.Dropdown], value: dateLib.getMonth(calendarMonth.date) })) : (react_1.default.createElement("span", { key: "month" }, formatMonthDropdown(calendarMonth.date, dateLib)));
300
+ const yearControl = captionLayout === "dropdown" ||
301
+ captionLayout === "dropdown-years" ? (react_1.default.createElement(components.YearsDropdown, { key: "year", className: classNames[UI_js_1.UI.YearsDropdown], "aria-label": labelYearDropdown(dateLib.options), disabled: Boolean(props.disableNavigation), onChange: handleYearChange(calendarMonth.date, monthOffset), options: (0, getYearOptions_js_1.getYearOptions)(navStart, navEnd, formatters, dateLib, Boolean(props.reverseYears)), style: styles?.[UI_js_1.UI.Dropdown], value: dateLib.getYear(calendarMonth.date) })) : (react_1.default.createElement("span", { key: "year" }, formatYearDropdown(calendarMonth.date, dateLib)));
302
+ const controls = dateLib.getMonthYearOrder() === "year-first"
303
+ ? [yearControl, monthControl]
304
+ : [monthControl, yearControl];
305
+ return controls;
306
+ })(),
307
+ react_1.default.createElement("span", { role: "status", "aria-live": "polite", style: {
308
+ border: 0,
309
+ clip: "rect(0 0 0 0)",
310
+ height: "1px",
311
+ margin: "-1px",
312
+ overflow: "hidden",
313
+ padding: 0,
314
+ position: "absolute",
315
+ width: "1px",
316
+ whiteSpace: "nowrap",
317
+ wordWrap: "normal",
318
+ } }, formatCaption(calendarMonth.date, dateLib.options, dateLib)))) : (react_1.default.createElement(components.CaptionLabel, { className: classNames[UI_js_1.UI.CaptionLabel], role: "status", "aria-live": "polite" }, formatCaption(calendarMonth.date, dateLib.options, dateLib)))),
319
+ navLayout === "around" &&
320
+ !props.hideNavigation &&
321
+ displayIndex === numberOfMonths - 1 && (react_1.default.createElement(components.NextMonthButton, { type: "button", className: classNames[UI_js_1.UI.NextMonthButton], tabIndex: nextMonth ? undefined : -1, "aria-disabled": nextMonth ? undefined : true, "aria-label": labelNext(nextMonth), onClick: handleNextClick, "data-animated-button": props.animate ? "true" : undefined },
322
+ react_1.default.createElement(components.Chevron, { disabled: nextMonth ? undefined : true, className: classNames[UI_js_1.UI.Chevron], orientation: props.dir === "rtl" ? "left" : "right" }))),
323
+ displayIndex === numberOfMonths - 1 &&
324
+ navLayout === "after" &&
325
+ !props.hideNavigation && (react_1.default.createElement(components.Nav, { "data-animated-nav": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Nav], style: styles?.[UI_js_1.UI.Nav], "aria-label": labelNav(), onPreviousClick: handlePreviousClick, onNextClick: handleNextClick, previousMonth: previousMonth, nextMonth: nextMonth })),
326
+ react_1.default.createElement(components.MonthGrid, { role: "grid", "aria-multiselectable": mode === "multiple" || mode === "range", "aria-label": labelGrid(calendarMonth.date, dateLib.options, dateLib) ||
327
+ undefined, className: classNames[UI_js_1.UI.MonthGrid], style: styles?.[UI_js_1.UI.MonthGrid] },
328
+ !props.hideWeekdays && (react_1.default.createElement(components.Weekdays, { "data-animated-weekdays": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Weekdays], style: styles?.[UI_js_1.UI.Weekdays] },
329
+ showWeekNumber && (react_1.default.createElement(components.WeekNumberHeader, { "aria-label": labelWeekNumberHeader(dateLib.options), className: classNames[UI_js_1.UI.WeekNumberHeader], style: styles?.[UI_js_1.UI.WeekNumberHeader], scope: "col" }, formatWeekNumberHeader())),
330
+ weekdays.map((weekday) => (react_1.default.createElement(components.Weekday, { "aria-label": labelWeekday(weekday, dateLib.options, dateLib), className: classNames[UI_js_1.UI.Weekday], key: String(weekday), style: styles?.[UI_js_1.UI.Weekday], scope: "col" }, formatWeekdayName(weekday, dateLib.options, dateLib)))))),
331
+ react_1.default.createElement(components.Weeks, { "data-animated-weeks": props.animate ? "true" : undefined, className: classNames[UI_js_1.UI.Weeks], style: styles?.[UI_js_1.UI.Weeks] }, calendarMonth.weeks.map((week) => {
332
+ return (react_1.default.createElement(components.Week, { className: classNames[UI_js_1.UI.Week], key: week.weekNumber, style: styles?.[UI_js_1.UI.Week], week: week },
333
+ showWeekNumber && (react_1.default.createElement(components.WeekNumber, { week: week, style: styles?.[UI_js_1.UI.WeekNumber], "aria-label": labelWeekNumber(week.weekNumber, {
334
+ locale,
335
+ }), className: classNames[UI_js_1.UI.WeekNumber], scope: "row", role: "rowheader" }, formatWeekNumber(week.weekNumber, dateLib))),
336
+ week.days.map((day) => {
337
+ const { date } = day;
338
+ const modifiers = getModifiers(day);
339
+ modifiers[UI_js_1.DayFlag.focused] =
340
+ !modifiers.hidden &&
341
+ Boolean(focused?.isEqualTo(day));
342
+ modifiers[UI_js_1.SelectionState.selected] =
343
+ isSelected?.(date) || modifiers.selected;
344
+ if ((0, typeguards_js_1.isDateRange)(selectedValue)) {
345
+ // add range modifiers
346
+ const { from, to } = selectedValue;
347
+ modifiers[UI_js_1.SelectionState.range_start] = Boolean(from && to && dateLib.isSameDay(date, from));
348
+ modifiers[UI_js_1.SelectionState.range_end] = Boolean(from && to && dateLib.isSameDay(date, to));
349
+ modifiers[UI_js_1.SelectionState.range_middle] =
350
+ (0, rangeIncludesDate_js_1.rangeIncludesDate)(selectedValue, date, true, dateLib);
351
+ }
352
+ const style = (0, getStyleForModifiers_js_1.getStyleForModifiers)(modifiers, styles, props.modifiersStyles);
353
+ const className = (0, getClassNamesForModifiers_js_1.getClassNamesForModifiers)(modifiers, classNames, props.modifiersClassNames);
354
+ const ariaLabel = !isInteractive && !modifiers.hidden
355
+ ? labelGridcell(date, modifiers, dateLib.options, dateLib)
356
+ : undefined;
357
+ return (react_1.default.createElement(components.Day, { key: `${day.isoDate}_${day.displayMonthId}`, day: day, modifiers: modifiers, className: className.join(" "), style: style, role: "gridcell", "aria-selected": modifiers.selected || undefined, "aria-label": ariaLabel, "data-day": day.isoDate, "data-month": day.outside ? day.dateMonthId : undefined, "data-selected": modifiers.selected || undefined, "data-disabled": modifiers.disabled || undefined, "data-hidden": modifiers.hidden || undefined, "data-outside": day.outside || undefined, "data-focused": modifiers.focused || undefined, "data-today": modifiers.today || undefined }, !modifiers.hidden && isInteractive ? (react_1.default.createElement(components.DayButton, { className: classNames[UI_js_1.UI.DayButton], style: styles?.[UI_js_1.UI.DayButton], type: "button", day: day, modifiers: modifiers, disabled: (!modifiers.focused &&
358
+ modifiers.disabled) ||
359
+ undefined, "aria-disabled": (modifiers.focused &&
360
+ modifiers.disabled) ||
361
+ undefined, tabIndex: isFocusTarget(day) ? 0 : -1, "aria-label": labelDayButton(date, modifiers, dateLib.options, dateLib), onClick: handleDayClick(day, modifiers), onBlur: handleDayBlur(day, modifiers), onFocus: handleDayFocus(day, modifiers), onKeyDown: handleDayKeyDown(day, modifiers), onMouseEnter: handleDayMouseEnter(day, modifiers), onMouseLeave: handleDayMouseLeave(day, modifiers) }, formatDay(date, dateLib.options, dateLib))) : (!modifiers.hidden &&
362
+ formatDay(day.date, dateLib.options, dateLib))));
363
+ })));
364
+ })))));
365
+ })),
365
366
  props.footer && (react_1.default.createElement(components.Footer, { className: classNames[UI_js_1.UI.Footer], style: styles?.[UI_js_1.UI.Footer], role: "status", "aria-live": "polite" }, props.footer)))));
366
367
  }
@@ -19,6 +19,7 @@ export interface DayPickerLocale extends DateFnsLocale {
19
19
  /** Localized DayPicker-specific labels. */
20
20
  labels?: DayPickerLocaleLabels;
21
21
  }
22
+ /** Alias for the locale shape accepted by DayPicker APIs. */
22
23
  export type Locale = DayPickerLocale;
23
24
  /** Indicates the preferred ordering of month and year for localized labels. */
24
25
  export type MonthYearOrder = "month-first" | "year-first";
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function CaptionLabel(props: HTMLAttributes<HTMLSpanElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link CaptionLabel} component. */
9
10
  export type CaptionLabelProps = Parameters<typeof CaptionLabel>[0];
@@ -18,4 +18,5 @@ export declare function Chevron(props: {
18
18
  /** The orientation of the chevron. */
19
19
  orientation?: "up" | "down" | "left" | "right";
20
20
  }): React.JSX.Element;
21
+ /** Props accepted by the {@link Chevron} component. */
21
22
  export type ChevronProps = Parameters<typeof Chevron>[0];
@@ -17,4 +17,5 @@ export declare function Day(props: {
17
17
  /** The modifiers to apply to the day. */
18
18
  modifiers: Modifiers;
19
19
  } & HTMLAttributes<HTMLDivElement>): React.JSX.Element;
20
+ /** Props accepted by the {@link Day} component. */
20
21
  export type DayProps = Parameters<typeof Day>[0];
@@ -13,4 +13,5 @@ export declare function DayButton(props: {
13
13
  /** The modifiers to apply to the day. */
14
14
  modifiers: Modifiers;
15
15
  } & ButtonHTMLAttributes<HTMLButtonElement>): React.JSX.Element;
16
+ /** Props accepted by the {@link DayButton} component. */
16
17
  export type DayButtonProps = Parameters<typeof DayButton>[0];
@@ -18,4 +18,5 @@ export declare function Dropdown(props: {
18
18
  /** The options to display in the dropdown. */
19
19
  options?: DropdownOption[] | undefined;
20
20
  } & Omit<SelectHTMLAttributes<HTMLSelectElement>, "children">): React.JSX.Element;
21
+ /** Props accepted by the {@link Dropdown} component. */
21
22
  export type DropdownProps = Parameters<typeof Dropdown>[0];
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function DropdownNav(props: HTMLAttributes<HTMLDivElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link DropdownNav} component. */
9
10
  export type DropdownNavProps = Parameters<typeof DropdownNav>[0];
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Footer(props: HTMLAttributes<HTMLDivElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Footer} component. */
9
10
  export type FooterProps = Parameters<typeof Footer>[0];
@@ -13,4 +13,5 @@ export declare function Month(props: {
13
13
  /** The index of the month being displayed. */
14
14
  displayIndex: number;
15
15
  } & HTMLAttributes<HTMLDivElement>): React.JSX.Element;
16
+ /** Props accepted by the {@link Month} component. */
16
17
  export type MonthProps = Parameters<typeof Month>[0];
@@ -12,4 +12,5 @@ export declare function MonthCaption(props: {
12
12
  /** The index of the month being displayed. */
13
13
  displayIndex: number;
14
14
  } & HTMLAttributes<HTMLDivElement>): React.JSX.Element;
15
+ /** Props accepted by the {@link MonthCaption} component. */
15
16
  export type MonthCaptionProps = Parameters<typeof MonthCaption>[0];
@@ -6,4 +6,5 @@ import React, { type TableHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function MonthGrid(props: TableHTMLAttributes<HTMLTableElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link MonthGrid} component. */
9
10
  export type MonthGridProps = Parameters<typeof MonthGrid>[0];
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Months(props: HTMLAttributes<HTMLDivElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Months} component. */
9
10
  export type MonthsProps = Parameters<typeof Months>[0];
@@ -15,4 +15,5 @@ export declare function Nav(props: {
15
15
  /** The date of the next month, if available. */
16
16
  nextMonth?: Date | undefined;
17
17
  } & HTMLAttributes<HTMLElement>): React.JSX.Element;
18
+ /** Props accepted by the {@link Nav} component. */
18
19
  export type NavProps = Parameters<typeof Nav>[0];
@@ -6,4 +6,5 @@ import React, { type ButtonHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function NextMonthButton(props: ButtonHTMLAttributes<HTMLButtonElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link NextMonthButton} component. */
9
10
  export type NextMonthButtonProps = Parameters<typeof NextMonthButton>[0];
@@ -6,4 +6,5 @@ import React, { type OptionHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Option(props: OptionHTMLAttributes<HTMLOptionElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Option} component. */
9
10
  export type OptionProps = Parameters<typeof Option>[0];
@@ -6,4 +6,5 @@ import React, { type ButtonHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function PreviousMonthButton(props: ButtonHTMLAttributes<HTMLButtonElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link PreviousMonthButton} component. */
9
10
  export type PreviousMonthButtonProps = Parameters<typeof PreviousMonthButton>[0];
@@ -9,4 +9,5 @@ export declare function Root(props: {
9
9
  /** Ref for the root element, used when `animate` is `true`. */
10
10
  rootRef?: Ref<HTMLDivElement>;
11
11
  } & HTMLAttributes<HTMLDivElement>): React.JSX.Element;
12
+ /** Props accepted by the {@link Root} component. */
12
13
  export type RootProps = Parameters<typeof Root>[0];
@@ -6,4 +6,5 @@ import React, { type SelectHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Select(props: SelectHTMLAttributes<HTMLSelectElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Select} component. */
9
10
  export type SelectProps = Parameters<typeof Select>[0];
@@ -10,4 +10,5 @@ export declare function Week(props: {
10
10
  /** The week to render. */
11
11
  week: CalendarWeek;
12
12
  } & HTMLAttributes<HTMLTableRowElement>): React.JSX.Element;
13
+ /** Props accepted by the {@link Week} component. */
13
14
  export type WeekProps = Parameters<typeof Week>[0];
@@ -10,4 +10,5 @@ export declare function WeekNumber(props: {
10
10
  /** The week to display. */
11
11
  week: CalendarWeek;
12
12
  } & ThHTMLAttributes<HTMLTableCellElement>): React.JSX.Element;
13
+ /** Props accepted by the {@link WeekNumber} component. */
13
14
  export type WeekNumberProps = Parameters<typeof WeekNumber>[0];
@@ -6,4 +6,5 @@ import React, { type ThHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function WeekNumberHeader(props: ThHTMLAttributes<HTMLTableCellElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link WeekNumberHeader} component. */
9
10
  export type WeekNumberHeaderProps = Parameters<typeof WeekNumberHeader>[0];
@@ -6,4 +6,5 @@ import React, { type ThHTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Weekday(props: ThHTMLAttributes<HTMLTableCellElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Weekday} component. */
9
10
  export type WeekdayProps = Parameters<typeof Weekday>[0];
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Weekdays(props: HTMLAttributes<HTMLTableRowElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Weekdays} component. */
9
10
  export type WeekdaysProps = Parameters<typeof Weekdays>[0];
@@ -6,4 +6,5 @@ import React, { type HTMLAttributes } from "react";
6
6
  * @see https://daypicker.dev/guides/custom-components
7
7
  */
8
8
  export declare function Weeks(props: HTMLAttributes<HTMLTableSectionElement>): React.JSX.Element;
9
+ /** Props accepted by the {@link Weeks} component. */
9
10
  export type WeeksProps = Parameters<typeof Weeks>[0];
@@ -11,7 +11,6 @@ export type { DayPickerLocale, DayPickerLocaleLabels, } from "./classes/DateLib.
11
11
  * @since V9.12.0
12
12
  */
13
13
  export { af } from "./locale/af.js";
14
- export { amET } from "./locale/am-ET.js";
15
14
  export { ar } from "./locale/ar.js";
16
15
  export { arDZ } from "./locale/ar-DZ.js";
17
16
  export { arEG } from "./locale/ar-EG.js";
@@ -14,8 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.id = exports.hy = exports.hu = exports.ht = exports.hr = exports.hi = exports.he = exports.gu = exports.gl = exports.gd = exports.fy = exports.frCH = exports.frCA = exports.fr = exports.fi = exports.faIR = exports.eu = exports.et = exports.es = exports.eo = exports.enZA = exports.enUS = exports.enNZ = exports.enIN = exports.enIE = exports.enGB = exports.enCA = exports.enAU = exports.el = exports.deAT = exports.de = exports.da = exports.cy = exports.cs = exports.ckb = exports.ca = exports.bs = exports.bn = exports.bg = exports.beTarask = exports.be = exports.az = exports.arTN = exports.arSA = exports.arMA = exports.arEG = exports.arDZ = exports.ar = exports.amET = exports.af = void 0;
18
- exports.zhTW = exports.zhHK = exports.zhCN = exports.vi = exports.uzCyrl = exports.uz = exports.uk = exports.ug = exports.tr = exports.th = exports.te = exports.ta = exports.sv = exports.srLatn = exports.sr = exports.sq = exports.sl = exports.sk = exports.se = exports.ru = exports.ro = exports.ptBR = exports.pt = exports.pl = exports.oc = exports.nn = exports.nlBE = exports.nl = exports.nb = exports.mt = exports.ms = exports.mn = exports.mk = exports.lv = exports.lt = exports.lb = exports.ko = exports.kn = exports.km = exports.kk = exports.ka = exports.jaHira = exports.ja = exports.itCH = exports.it = exports.is = void 0;
17
+ exports.is = exports.id = exports.hy = exports.hu = exports.ht = exports.hr = exports.hi = exports.he = exports.gu = exports.gl = exports.gd = exports.fy = exports.frCH = exports.frCA = exports.fr = exports.fi = exports.faIR = exports.eu = exports.et = exports.es = exports.eo = exports.enZA = exports.enUS = exports.enNZ = exports.enIN = exports.enIE = exports.enGB = exports.enCA = exports.enAU = exports.el = exports.deAT = exports.de = exports.da = exports.cy = exports.cs = exports.ckb = exports.ca = exports.bs = exports.bn = exports.bg = exports.beTarask = exports.be = exports.az = exports.arTN = exports.arSA = exports.arMA = exports.arEG = exports.arDZ = exports.ar = exports.af = void 0;
18
+ exports.zhTW = exports.zhHK = exports.zhCN = exports.vi = exports.uzCyrl = exports.uz = exports.uk = exports.ug = exports.tr = exports.th = exports.te = exports.ta = exports.sv = exports.srLatn = exports.sr = exports.sq = exports.sl = exports.sk = exports.se = exports.ru = exports.ro = exports.ptBR = exports.pt = exports.pl = exports.oc = exports.nn = exports.nlBE = exports.nl = exports.nb = exports.mt = exports.ms = exports.mn = exports.mk = exports.lv = exports.lt = exports.lb = exports.ko = exports.kn = exports.km = exports.kk = exports.ka = exports.jaHira = exports.ja = exports.itCH = exports.it = void 0;
19
19
  __exportStar(require("date-fns/locale"), exports);
20
20
  /**
21
21
  * DayPicker locales extended with translated labels.
@@ -24,8 +24,6 @@ __exportStar(require("date-fns/locale"), exports);
24
24
  */
25
25
  var af_js_1 = require("./locale/af.js");
26
26
  Object.defineProperty(exports, "af", { enumerable: true, get: function () { return af_js_1.af; } });
27
- var am_ET_js_1 = require("./locale/am-ET.js");
28
- Object.defineProperty(exports, "amET", { enumerable: true, get: function () { return am_ET_js_1.amET; } });
29
27
  var ar_js_1 = require("./locale/ar.js");
30
28
  Object.defineProperty(exports, "ar", { enumerable: true, get: function () { return ar_js_1.ar; } });
31
29
  var ar_DZ_js_1 = require("./locale/ar-DZ.js");
@@ -163,7 +163,8 @@ export interface PropsBase {
163
163
  * - `after`: Displays the buttons after the caption. This ensures the tab order
164
164
  * matches the visual order.
165
165
  *
166
- * Default value is `after`.
166
+ * If not set, DayPicker preserves its legacy layout, but the tab order may
167
+ * not align with the visual order when using `captionLayout="dropdown"`.
167
168
  *
168
169
  * @since 9.7.0
169
170
  * @see https://daypicker.dev/docs/customization#navigation-layouts
@@ -1,5 +1,6 @@
1
1
  import type { DayPickerProps } from "./props.js";
2
2
  import type { DateRange, Mode, Modifiers } from "./shared.js";
3
+ /** Selection state and helpers for the active selection mode. */
3
4
  export type Selection<T extends DayPickerProps> = {
4
5
  /** The selected date(s). */
5
6
  selected: SelectedValue<T> | undefined;
@@ -8,12 +9,15 @@ export type Selection<T extends DayPickerProps> = {
8
9
  /** Whether the given date is selected. */
9
10
  isSelected: (date: Date) => boolean;
10
11
  };
12
+ /** Selected value for single selection mode, respecting required selections. */
11
13
  export type SelectedSingle<T extends {
12
14
  required?: boolean;
13
15
  }> = T["required"] extends true ? Date : Date | undefined;
16
+ /** Selected value for multiple selection mode, respecting required selections. */
14
17
  export type SelectedMulti<T extends {
15
18
  required?: boolean;
16
19
  }> = T["required"] extends true ? Date[] : Date[] | undefined;
20
+ /** Selected value for range selection mode, respecting required selections. */
17
21
  export type SelectedRange<T extends {
18
22
  required?: boolean;
19
23
  }> = T["required"] extends true ? DateRange : DateRange | undefined;
@@ -46,12 +50,15 @@ export type SelectedValue<T> = T extends {
46
50
  mode: "range";
47
51
  required?: boolean;
48
52
  } ? SelectedRange<T> : undefined;
53
+ /** Selection handler for single selection mode. */
49
54
  export type SelectHandlerSingle<T extends {
50
55
  required?: boolean | undefined;
51
56
  }> = (triggerDate: Date, modifiers: Modifiers, e: React.MouseEvent | React.KeyboardEvent) => T["required"] extends true ? Date : Date | undefined;
57
+ /** Selection handler for multiple selection mode. */
52
58
  export type SelectHandlerMulti<T extends {
53
59
  required?: boolean | undefined;
54
60
  }> = (triggerDate: Date, modifiers: Modifiers, e: React.MouseEvent | React.KeyboardEvent) => T["required"] extends true ? Date[] : Date[] | undefined;
61
+ /** Selection handler for range selection mode. */
55
62
  export type SelectHandlerRange<T extends {
56
63
  required?: boolean | undefined;
57
64
  }> = (triggerDate: Date, modifiers: Modifiers, e: React.MouseEvent | React.KeyboardEvent) => T["required"] extends true ? DateRange : DateRange | undefined;