react-day-picker 9.6.5 → 9.6.7

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.
@@ -17,6 +17,6 @@ function Chevron(props) {
17
17
  orientation === "up" && (react_1.default.createElement("polygon", { points: "6.77 17 12.5 11.43 18.24 17 20 15.28 12.5 8 5 15.28" })),
18
18
  orientation === "down" && (react_1.default.createElement("polygon", { points: "6.77 8 12.5 13.57 18.24 8 20 9.72 12.5 17 5 9.72" })),
19
19
  orientation === "left" && (react_1.default.createElement("polygon", { points: "16 18.112 9.81111111 12 16 5.87733333 14.0888889 4 6 12 14.0888889 20" })),
20
- orientation === "right" && (react_1.default.createElement("polygon", { points: "8 18.612 14.1888889 12.5 8 6.37733333 9.91111111 4.5 18 12.5 9.91111111 20.5" }))));
20
+ orientation === "right" && (react_1.default.createElement("polygon", { points: "8 18.112 14.18888889 12 8 5.87733333 9.91111111 4 18 12 9.91111111 20" }))));
21
21
  }
22
22
  //# sourceMappingURL=Chevron.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chevron.js","sourceRoot":"","sources":["../../../src/components/Chevron.tsx"],"names":[],"mappings":";;;;;AAQA,0BA+BC;AAvCD,kDAA0B;AAE1B;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,KAYvB;IACC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7D,OAAO,CACL,uCAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,WAAW;QACtE,WAAW,KAAK,IAAI,IAAI,CACvB,2CAAS,MAAM,EAAC,qDAAqD,GAAG,CACzE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,2CAAS,MAAM,EAAC,kDAAkD,GAAG,CACtE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,2CAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F;QACA,WAAW,KAAK,OAAO,IAAI,CAC1B,2CAAS,MAAM,EAAC,8EAA8E,GAAW,CAC1G,CACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Chevron.js","sourceRoot":"","sources":["../../../src/components/Chevron.tsx"],"names":[],"mappings":";;;;;AAQA,0BA+BC;AAvCD,kDAA0B;AAE1B;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,KAYvB;IACC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7D,OAAO,CACL,uCAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,WAAW;QACtE,WAAW,KAAK,IAAI,IAAI,CACvB,2CAAS,MAAM,EAAC,qDAAqD,GAAG,CACzE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,2CAAS,MAAM,EAAC,kDAAkD,GAAG,CACtE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,2CAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F;QACA,WAAW,KAAK,OAAO,IAAI,CAC1B,2CAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F,CACG,CACP,CAAC;AACJ,CAAC"}
@@ -2,41 +2,49 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.calculateFocusTarget = calculateFocusTarget;
4
4
  const UI_js_1 = require("../UI.js");
5
+ var FocusTargetPriority;
6
+ (function (FocusTargetPriority) {
7
+ FocusTargetPriority[FocusTargetPriority["Today"] = 0] = "Today";
8
+ FocusTargetPriority[FocusTargetPriority["Selected"] = 1] = "Selected";
9
+ FocusTargetPriority[FocusTargetPriority["LastFocused"] = 2] = "LastFocused";
10
+ FocusTargetPriority[FocusTargetPriority["FocusedModifier"] = 3] = "FocusedModifier";
11
+ })(FocusTargetPriority || (FocusTargetPriority = {}));
12
+ function isFocusableDay(modifiers) {
13
+ return (!modifiers[UI_js_1.DayFlag.disabled] &&
14
+ !modifiers[UI_js_1.DayFlag.hidden] &&
15
+ !modifiers[UI_js_1.DayFlag.outside]);
16
+ }
5
17
  function calculateFocusTarget(days, getModifiers, isSelected, lastFocused) {
6
18
  let focusTarget;
7
- let index = 0;
8
- let found = false;
9
- while (index < days.length && !found) {
10
- const day = days[index];
19
+ let foundFocusTargetPriority = -1;
20
+ for (const day of days) {
11
21
  const modifiers = getModifiers(day);
12
- if (!modifiers[UI_js_1.DayFlag.disabled] &&
13
- !modifiers[UI_js_1.DayFlag.hidden] &&
14
- !modifiers[UI_js_1.DayFlag.outside]) {
15
- if (modifiers[UI_js_1.DayFlag.focused]) {
22
+ if (isFocusableDay(modifiers)) {
23
+ if (modifiers[UI_js_1.DayFlag.focused] &&
24
+ foundFocusTargetPriority < FocusTargetPriority.FocusedModifier) {
16
25
  focusTarget = day;
17
- found = true;
26
+ foundFocusTargetPriority = FocusTargetPriority.FocusedModifier;
18
27
  }
19
- else if (lastFocused?.isEqualTo(day)) {
28
+ else if (lastFocused?.isEqualTo(day) &&
29
+ foundFocusTargetPriority < FocusTargetPriority.LastFocused) {
20
30
  focusTarget = day;
21
- found = true;
31
+ foundFocusTargetPriority = FocusTargetPriority.LastFocused;
22
32
  }
23
- else if (isSelected(day.date)) {
33
+ else if (isSelected(day.date) &&
34
+ foundFocusTargetPriority < FocusTargetPriority.Selected) {
24
35
  focusTarget = day;
25
- found = true;
36
+ foundFocusTargetPriority = FocusTargetPriority.Selected;
26
37
  }
27
- else if (modifiers[UI_js_1.DayFlag.today]) {
38
+ else if (modifiers[UI_js_1.DayFlag.today] &&
39
+ foundFocusTargetPriority < FocusTargetPriority.Today) {
28
40
  focusTarget = day;
29
- found = true;
41
+ foundFocusTargetPriority = FocusTargetPriority.Today;
30
42
  }
31
43
  }
32
- index++;
33
44
  }
34
45
  if (!focusTarget) {
35
46
  // return the first day that is focusable
36
- focusTarget = days.find((day) => {
37
- const m = getModifiers(day);
38
- return !m[UI_js_1.DayFlag.disabled] && !m[UI_js_1.DayFlag.hidden] && !m[UI_js_1.DayFlag.outside];
39
- });
47
+ focusTarget = days.find((day) => isFocusableDay(getModifiers(day)));
40
48
  }
41
49
  return focusTarget;
42
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculateFocusTarget.js","sourceRoot":"","sources":["../../../src/helpers/calculateFocusTarget.ts"],"names":[],"mappings":";;AAIA,oDA8CC;AAlDD,oCAAmC;AAInC,SAAgB,oBAAoB,CAClC,IAAmB,EACnB,YAA6C,EAC7C,UAAmC,EACnC,WAAoC;IAEpC,IAAI,WAAoC,CAAC;IAEzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpC,IACE,CAAC,SAAS,CAAC,eAAO,CAAC,QAAQ,CAAC;YAC5B,CAAC,SAAS,CAAC,eAAO,CAAC,MAAM,CAAC;YAC1B,CAAC,SAAS,CAAC,eAAO,CAAC,OAAO,CAAC,EAC3B,CAAC;YACD,IAAI,SAAS,CAAC,eAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,SAAS,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QAED,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,yCAAyC;QACzC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,eAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,eAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAO,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"calculateFocusTarget.js","sourceRoot":"","sources":["../../../src/helpers/calculateFocusTarget.ts"],"names":[],"mappings":";;AAmBA,oDA8CC;AAjED,oCAAmC;AAInC,IAAK,mBAKJ;AALD,WAAK,mBAAmB;IACtB,+DAAS,CAAA;IACT,qEAAQ,CAAA;IACR,2EAAW,CAAA;IACX,mFAAe,CAAA;AACjB,CAAC,EALI,mBAAmB,KAAnB,mBAAmB,QAKvB;AAED,SAAS,cAAc,CAAC,SAAoB;IAC1C,OAAO,CACL,CAAC,SAAS,CAAC,eAAO,CAAC,QAAQ,CAAC;QAC5B,CAAC,SAAS,CAAC,eAAO,CAAC,MAAM,CAAC;QAC1B,CAAC,SAAS,CAAC,eAAO,CAAC,OAAO,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAClC,IAAmB,EACnB,YAA6C,EAC7C,UAAmC,EACnC,WAAoC;IAEpC,IAAI,WAAoC,CAAC;IAEzC,IAAI,wBAAwB,GAA6B,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IACE,SAAS,CAAC,eAAO,CAAC,OAAO,CAAC;gBAC1B,wBAAwB,GAAG,mBAAmB,CAAC,eAAe,EAC9D,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,eAAe,CAAC;YACjE,CAAC;iBAAM,IACL,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC;gBAC3B,wBAAwB,GAAG,mBAAmB,CAAC,WAAW,EAC1D,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,WAAW,CAAC;YAC7D,CAAC;iBAAM,IACL,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpB,wBAAwB,GAAG,mBAAmB,CAAC,QAAQ,EACvD,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1D,CAAC;iBAAM,IACL,SAAS,CAAC,eAAO,CAAC,KAAK,CAAC;gBACxB,wBAAwB,GAAG,mBAAmB,CAAC,KAAK,EACpD,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,KAAK,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,yCAAyC;QACzC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getInitialMonth = getInitialMonth;
4
+ const tz_1 = require("@date-fns/tz");
4
5
  /** Return the start month based on the props passed to DayPicker. */
5
6
  function getInitialMonth(props, dateLib) {
6
- const { month, defaultMonth, today = dateLib.today(), numberOfMonths = 1, endMonth, startMonth } = props;
7
+ const { month, defaultMonth, today = dateLib.today(), numberOfMonths = 1, endMonth, startMonth, timeZone } = props;
7
8
  let initialMonth = month || defaultMonth || today;
8
9
  const { differenceInCalendarMonths, addMonths, startOfMonth } = dateLib;
9
10
  // Fix the initialMonth if is after the endMonth
@@ -15,6 +16,8 @@ function getInitialMonth(props, dateLib) {
15
16
  if (startMonth && differenceInCalendarMonths(initialMonth, startMonth) < 0) {
16
17
  initialMonth = startMonth;
17
18
  }
19
+ // When timeZone is provided, convert initialMonth to TZDate type to ensure proper timezone handling
20
+ initialMonth = timeZone ? new tz_1.TZDate(initialMonth, timeZone) : initialMonth;
18
21
  return startOfMonth(initialMonth);
19
22
  }
20
23
  //# sourceMappingURL=getInitialMonth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getInitialMonth.js","sourceRoot":"","sources":["../../../src/helpers/getInitialMonth.ts"],"names":[],"mappings":";;AAIA,0CAoCC;AArCD,qEAAqE;AACrE,SAAgB,eAAe,CAC7B,KAWC,EACD,OAAgB;IAEhB,MAAM,EACJ,KAAK,EACL,YAAY,EACZ,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EACvB,cAAc,GAAG,CAAC,EAClB,QAAQ,EACR,UAAU,EACX,GAAG,KAAK,CAAC;IACV,IAAI,YAAY,GAAG,KAAK,IAAI,YAAY,IAAI,KAAK,CAAC;IAClD,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAExE,gDAAgD;IAChD,IAAI,QAAQ,IAAI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzC,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,mDAAmD;IACnD,IAAI,UAAU,IAAI,0BAA0B,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,YAAY,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"getInitialMonth.js","sourceRoot":"","sources":["../../../src/helpers/getInitialMonth.ts"],"names":[],"mappings":";;AAMA,0CAwCC;AA9CD,qCAAsC;AAKtC,qEAAqE;AACrE,SAAgB,eAAe,CAC7B,KAWC,EACD,OAAgB;IAEhB,MAAM,EACJ,KAAK,EACL,YAAY,EACZ,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EACvB,cAAc,GAAG,CAAC,EAClB,QAAQ,EACR,UAAU,EACV,QAAQ,EACT,GAAG,KAAK,CAAC;IACV,IAAI,YAAY,GAAG,KAAK,IAAI,YAAY,IAAI,KAAK,CAAC;IAClD,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAExE,gDAAgD;IAChD,IAAI,QAAQ,IAAI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzC,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,mDAAmD;IACnD,IAAI,UAAU,IAAI,0BAA0B,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,YAAY,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,oGAAoG;IACpG,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAE5E,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC"}
@@ -11,6 +11,6 @@ export function Chevron(props) {
11
11
  orientation === "up" && (React.createElement("polygon", { points: "6.77 17 12.5 11.43 18.24 17 20 15.28 12.5 8 5 15.28" })),
12
12
  orientation === "down" && (React.createElement("polygon", { points: "6.77 8 12.5 13.57 18.24 8 20 9.72 12.5 17 5 9.72" })),
13
13
  orientation === "left" && (React.createElement("polygon", { points: "16 18.112 9.81111111 12 16 5.87733333 14.0888889 4 6 12 14.0888889 20" })),
14
- orientation === "right" && (React.createElement("polygon", { points: "8 18.612 14.1888889 12.5 8 6.37733333 9.91111111 4.5 18 12.5 9.91111111 20.5" }))));
14
+ orientation === "right" && (React.createElement("polygon", { points: "8 18.112 14.18888889 12 8 5.87733333 9.91111111 4 18 12 9.91111111 20" }))));
15
15
  }
16
16
  //# sourceMappingURL=Chevron.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chevron.js","sourceRoot":"","sources":["../../../src/components/Chevron.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,KAYvB;IACC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7D,OAAO,CACL,6BAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,WAAW;QACtE,WAAW,KAAK,IAAI,IAAI,CACvB,iCAAS,MAAM,EAAC,qDAAqD,GAAG,CACzE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,iCAAS,MAAM,EAAC,kDAAkD,GAAG,CACtE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,iCAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F;QACA,WAAW,KAAK,OAAO,IAAI,CAC1B,iCAAS,MAAM,EAAC,8EAA8E,GAAW,CAC1G,CACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Chevron.js","sourceRoot":"","sources":["../../../src/components/Chevron.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,KAYvB;IACC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7D,OAAO,CACL,6BAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,WAAW;QACtE,WAAW,KAAK,IAAI,IAAI,CACvB,iCAAS,MAAM,EAAC,qDAAqD,GAAG,CACzE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,iCAAS,MAAM,EAAC,kDAAkD,GAAG,CACtE;QACA,WAAW,KAAK,MAAM,IAAI,CACzB,iCAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F;QACA,WAAW,KAAK,OAAO,IAAI,CAC1B,iCAAS,MAAM,EAAC,uEAAuE,GAAG,CAC3F,CACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,39 +1,47 @@
1
1
  import { DayFlag } from "../UI.js";
2
+ var FocusTargetPriority;
3
+ (function (FocusTargetPriority) {
4
+ FocusTargetPriority[FocusTargetPriority["Today"] = 0] = "Today";
5
+ FocusTargetPriority[FocusTargetPriority["Selected"] = 1] = "Selected";
6
+ FocusTargetPriority[FocusTargetPriority["LastFocused"] = 2] = "LastFocused";
7
+ FocusTargetPriority[FocusTargetPriority["FocusedModifier"] = 3] = "FocusedModifier";
8
+ })(FocusTargetPriority || (FocusTargetPriority = {}));
9
+ function isFocusableDay(modifiers) {
10
+ return (!modifiers[DayFlag.disabled] &&
11
+ !modifiers[DayFlag.hidden] &&
12
+ !modifiers[DayFlag.outside]);
13
+ }
2
14
  export function calculateFocusTarget(days, getModifiers, isSelected, lastFocused) {
3
15
  let focusTarget;
4
- let index = 0;
5
- let found = false;
6
- while (index < days.length && !found) {
7
- const day = days[index];
16
+ let foundFocusTargetPriority = -1;
17
+ for (const day of days) {
8
18
  const modifiers = getModifiers(day);
9
- if (!modifiers[DayFlag.disabled] &&
10
- !modifiers[DayFlag.hidden] &&
11
- !modifiers[DayFlag.outside]) {
12
- if (modifiers[DayFlag.focused]) {
19
+ if (isFocusableDay(modifiers)) {
20
+ if (modifiers[DayFlag.focused] &&
21
+ foundFocusTargetPriority < FocusTargetPriority.FocusedModifier) {
13
22
  focusTarget = day;
14
- found = true;
23
+ foundFocusTargetPriority = FocusTargetPriority.FocusedModifier;
15
24
  }
16
- else if (lastFocused?.isEqualTo(day)) {
25
+ else if (lastFocused?.isEqualTo(day) &&
26
+ foundFocusTargetPriority < FocusTargetPriority.LastFocused) {
17
27
  focusTarget = day;
18
- found = true;
28
+ foundFocusTargetPriority = FocusTargetPriority.LastFocused;
19
29
  }
20
- else if (isSelected(day.date)) {
30
+ else if (isSelected(day.date) &&
31
+ foundFocusTargetPriority < FocusTargetPriority.Selected) {
21
32
  focusTarget = day;
22
- found = true;
33
+ foundFocusTargetPriority = FocusTargetPriority.Selected;
23
34
  }
24
- else if (modifiers[DayFlag.today]) {
35
+ else if (modifiers[DayFlag.today] &&
36
+ foundFocusTargetPriority < FocusTargetPriority.Today) {
25
37
  focusTarget = day;
26
- found = true;
38
+ foundFocusTargetPriority = FocusTargetPriority.Today;
27
39
  }
28
40
  }
29
- index++;
30
41
  }
31
42
  if (!focusTarget) {
32
43
  // return the first day that is focusable
33
- focusTarget = days.find((day) => {
34
- const m = getModifiers(day);
35
- return !m[DayFlag.disabled] && !m[DayFlag.hidden] && !m[DayFlag.outside];
36
- });
44
+ focusTarget = days.find((day) => isFocusableDay(getModifiers(day)));
37
45
  }
38
46
  return focusTarget;
39
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculateFocusTarget.js","sourceRoot":"","sources":["../../../src/helpers/calculateFocusTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAInC,MAAM,UAAU,oBAAoB,CAClC,IAAmB,EACnB,YAA6C,EAC7C,UAAmC,EACnC,WAAoC;IAEpC,IAAI,WAAoC,CAAC;IAEzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpC,IACE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5B,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC3B,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,WAAW,GAAG,GAAG,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QAED,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,yCAAyC;QACzC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"calculateFocusTarget.js","sourceRoot":"","sources":["../../../src/helpers/calculateFocusTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAInC,IAAK,mBAKJ;AALD,WAAK,mBAAmB;IACtB,+DAAS,CAAA;IACT,qEAAQ,CAAA;IACR,2EAAW,CAAA;IACX,mFAAe,CAAA;AACjB,CAAC,EALI,mBAAmB,KAAnB,mBAAmB,QAKvB;AAED,SAAS,cAAc,CAAC,SAAoB;IAC1C,OAAO,CACL,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5B,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1B,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAmB,EACnB,YAA6C,EAC7C,UAAmC,EACnC,WAAoC;IAEpC,IAAI,WAAoC,CAAC;IAEzC,IAAI,wBAAwB,GAA6B,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IACE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC1B,wBAAwB,GAAG,mBAAmB,CAAC,eAAe,EAC9D,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,eAAe,CAAC;YACjE,CAAC;iBAAM,IACL,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC;gBAC3B,wBAAwB,GAAG,mBAAmB,CAAC,WAAW,EAC1D,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,WAAW,CAAC;YAC7D,CAAC;iBAAM,IACL,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpB,wBAAwB,GAAG,mBAAmB,CAAC,QAAQ,EACvD,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1D,CAAC;iBAAM,IACL,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxB,wBAAwB,GAAG,mBAAmB,CAAC,KAAK,EACpD,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,wBAAwB,GAAG,mBAAmB,CAAC,KAAK,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,yCAAyC;QACzC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -1,6 +1,7 @@
1
+ import { TZDate } from "@date-fns/tz";
1
2
  /** Return the start month based on the props passed to DayPicker. */
2
3
  export function getInitialMonth(props, dateLib) {
3
- const { month, defaultMonth, today = dateLib.today(), numberOfMonths = 1, endMonth, startMonth } = props;
4
+ const { month, defaultMonth, today = dateLib.today(), numberOfMonths = 1, endMonth, startMonth, timeZone } = props;
4
5
  let initialMonth = month || defaultMonth || today;
5
6
  const { differenceInCalendarMonths, addMonths, startOfMonth } = dateLib;
6
7
  // Fix the initialMonth if is after the endMonth
@@ -12,6 +13,8 @@ export function getInitialMonth(props, dateLib) {
12
13
  if (startMonth && differenceInCalendarMonths(initialMonth, startMonth) < 0) {
13
14
  initialMonth = startMonth;
14
15
  }
16
+ // When timeZone is provided, convert initialMonth to TZDate type to ensure proper timezone handling
17
+ initialMonth = timeZone ? new TZDate(initialMonth, timeZone) : initialMonth;
15
18
  return startOfMonth(initialMonth);
16
19
  }
17
20
  //# sourceMappingURL=getInitialMonth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getInitialMonth.js","sourceRoot":"","sources":["../../../src/helpers/getInitialMonth.ts"],"names":[],"mappings":"AAGA,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,KAWC,EACD,OAAgB;IAEhB,MAAM,EACJ,KAAK,EACL,YAAY,EACZ,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EACvB,cAAc,GAAG,CAAC,EAClB,QAAQ,EACR,UAAU,EACX,GAAG,KAAK,CAAC;IACV,IAAI,YAAY,GAAG,KAAK,IAAI,YAAY,IAAI,KAAK,CAAC;IAClD,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAExE,gDAAgD;IAChD,IAAI,QAAQ,IAAI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzC,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,mDAAmD;IACnD,IAAI,UAAU,IAAI,0BAA0B,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,YAAY,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"getInitialMonth.js","sourceRoot":"","sources":["../../../src/helpers/getInitialMonth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKtC,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,KAWC,EACD,OAAgB;IAEhB,MAAM,EACJ,KAAK,EACL,YAAY,EACZ,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EACvB,cAAc,GAAG,CAAC,EAClB,QAAQ,EACR,UAAU,EACV,QAAQ,EACT,GAAG,KAAK,CAAC;IACV,IAAI,YAAY,GAAG,KAAK,IAAI,YAAY,IAAI,KAAK,CAAC;IAClD,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAExE,gDAAgD;IAChD,IAAI,QAAQ,IAAI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzC,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,mDAAmD;IACnD,IAAI,UAAU,IAAI,0BAA0B,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,YAAY,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,oGAAoG;IACpG,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAE5E,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "react-day-picker",
3
- "version": "9.6.5",
3
+ "version": "9.6.7",
4
4
  "description": "Customizable Date Picker for React",
5
5
  "author": "Giampaolo Bellavite <io@gpbl.dev>",
6
6
  "homepage": "https://daypicker.dev",
7
- "packageManager": "pnpm@9.11.0",
7
+ "packageManager": "pnpm@9.15.9",
8
8
  "engines": {
9
9
  "node": ">=18"
10
10
  },
@@ -183,48 +183,48 @@
183
183
  "locale.d.ts"
184
184
  ],
185
185
  "dependencies": {
186
- "@date-fns/tz": "^1.2.0",
187
- "date-fns": "^4.1.0",
188
- "date-fns-jalali": "^4.1.0-0"
186
+ "@date-fns/tz": "1.2.0",
187
+ "date-fns": "4.1.0",
188
+ "date-fns-jalali": "4.1.0-0"
189
189
  },
190
190
  "devDependencies": {
191
191
  "@jest/types": "^29.6.3",
192
- "@radix-ui/react-select": "^2.1.6",
192
+ "@radix-ui/react-select": "^2.1.7",
193
193
  "@swc/core": "^1.11.8",
194
194
  "@swc/jest": "^0.2.37",
195
195
  "@testing-library/dom": "^10.4.0",
196
196
  "@testing-library/jest-dom": "^6.6.3",
197
- "@testing-library/react": "^16.2.0",
197
+ "@testing-library/react": "^16.3.0",
198
198
  "@testing-library/user-event": "^14.6.1",
199
199
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
200
200
  "@types/jest": "^29.5.14",
201
- "@types/node": "^22.13.10",
202
- "@types/react": "^19.0.10",
203
- "@types/react-dom": "^19.0.4",
204
- "@typescript-eslint/eslint-plugin": "^8.26.0",
205
- "@typescript-eslint/parser": "^8.26.0",
201
+ "@types/node": "^22.14.1",
202
+ "@types/react": "^19.1.1",
203
+ "@types/react-dom": "^19.1.2",
204
+ "@typescript-eslint/eslint-plugin": "^8.29.1",
205
+ "@typescript-eslint/parser": "^8.29.1",
206
206
  "eslint": "^8.57.1",
207
- "eslint-config-prettier": "^10.1.1",
208
- "eslint-import-resolver-typescript": "^3.8.3",
207
+ "eslint-config-prettier": "^10.1.2",
208
+ "eslint-import-resolver-typescript": "^3.10.0",
209
209
  "eslint-plugin-import": "^2.31.0",
210
210
  "eslint-plugin-jest": "^28.11.0",
211
- "eslint-plugin-prettier": "^5.2.3",
212
- "eslint-plugin-react": "^7.37.4",
211
+ "eslint-plugin-prettier": "^5.2.6",
212
+ "eslint-plugin-react": "^7.37.5",
213
213
  "eslint-plugin-react-hooks": "^5.2.0",
214
214
  "eslint-plugin-require-extensions": "^0.1.3",
215
215
  "eslint-plugin-testing-library": "^7.1.1",
216
- "html-validate": "^9.4.2",
216
+ "html-validate": "^9.5.2",
217
217
  "jest": "^29.7.0",
218
218
  "jest-environment-jsdom": "^29.7.0",
219
219
  "jest-transform-css": "^6.0.2",
220
220
  "mockdate": "^3.0.5",
221
221
  "prettier": "^3.5.3",
222
222
  "prettier-plugin-jsdoc": "^1.3.2",
223
- "react": "^19.0.0",
224
- "react-dom": "^19.0.0",
223
+ "react": "^19.1.0",
224
+ "react-dom": "^19.1.0",
225
225
  "ts-node": "^10.9.2",
226
226
  "tslib": "^2.8.1",
227
- "typescript": "~5.8.2",
227
+ "typescript": "~5.8.3",
228
228
  "typescript-css-modules": "^1.0.4"
229
229
  },
230
230
  "peerDependencies": {
@@ -33,7 +33,7 @@ export function Chevron(props: {
33
33
  <polygon points="16 18.112 9.81111111 12 16 5.87733333 14.0888889 4 6 12 14.0888889 20" />
34
34
  )}
35
35
  {orientation === "right" && (
36
- <polygon points="8 18.612 14.1888889 12.5 8 6.37733333 9.91111111 4.5 18 12.5 9.91111111 20.5"></polygon>
36
+ <polygon points="8 18.112 14.18888889 12 8 5.87733333 9.91111111 4 18 12 9.91111111 20" />
37
37
  )}
38
38
  </svg>
39
39
  );
@@ -0,0 +1,167 @@
1
+ import { DayFlag } from "../UI.js";
2
+ import { CalendarDay } from "../classes/index.js";
3
+ import type { Modifiers } from "../types/index.js";
4
+
5
+ import { calculateFocusTarget } from "./calculateFocusTarget";
6
+
7
+ const todayModifiers = {
8
+ [DayFlag.today]: true
9
+ };
10
+
11
+ const todayHiddenModifiers = {
12
+ [DayFlag.today]: true,
13
+ [DayFlag.hidden]: true
14
+ };
15
+
16
+ const focusedModifiers = {
17
+ [DayFlag.focused]: true
18
+ };
19
+
20
+ const focusedDisabledModifiers = {
21
+ [DayFlag.focused]: true,
22
+ [DayFlag.disabled]: true
23
+ };
24
+
25
+ const outsideModifiers = {
26
+ [DayFlag.outside]: true
27
+ };
28
+
29
+ const hiddenModifiers = {
30
+ [DayFlag.hidden]: true
31
+ };
32
+
33
+ const disabledModifiers = {
34
+ [DayFlag.disabled]: true
35
+ };
36
+
37
+ const month = new Date(2021, 0, 1);
38
+ const day1 = new CalendarDay(new Date(2021, 0, 1), month);
39
+ const dayToday = new CalendarDay(new Date(2021, 0, 2), month);
40
+ const daySelected = new CalendarDay(new Date(2021, 0, 3), month);
41
+ const dayLastFocused = new CalendarDay(new Date(2021, 0, 4), month);
42
+ const dayFocusedModifier = new CalendarDay(new Date(2021, 0, 5), month);
43
+ const day6 = new CalendarDay(new Date(2021, 0, 6), month);
44
+
45
+ const days: CalendarDay[] = [
46
+ day1,
47
+ dayToday,
48
+ daySelected,
49
+ dayLastFocused,
50
+ dayFocusedModifier,
51
+ day6
52
+ ];
53
+
54
+ const isSelected = (date: Date) => {
55
+ return date.getTime() === daySelected.date.getTime();
56
+ };
57
+
58
+ function getModifiersFactory(
59
+ entries: [CalendarDay, Modifiers][]
60
+ ): (day: CalendarDay) => Modifiers {
61
+ const map = new Map(entries);
62
+ return (day) => map.get(day) ?? {};
63
+ }
64
+
65
+ describe("calculateFocusTarget", () => {
66
+ describe("when determining the focus target based on priority", () => {
67
+ it("should prioritize the day with the 'focused' modifier", () => {
68
+ const getModifiers = getModifiersFactory([
69
+ [day1, outsideModifiers],
70
+ [dayToday, todayModifiers],
71
+ [daySelected, {}],
72
+ [dayLastFocused, {}],
73
+ [dayFocusedModifier, focusedModifiers],
74
+ [day6, {}]
75
+ ]);
76
+
77
+ const focusTarget = calculateFocusTarget(
78
+ days,
79
+ getModifiers,
80
+ isSelected,
81
+ dayLastFocused
82
+ );
83
+
84
+ expect(focusTarget).toBe(dayFocusedModifier);
85
+ });
86
+
87
+ it("should fall back to the last focused day if no day has the 'focused' modifier", () => {
88
+ const getModifiers = getModifiersFactory([
89
+ [day1, outsideModifiers],
90
+ [dayToday, todayModifiers],
91
+ [daySelected, {}],
92
+ [dayLastFocused, {}],
93
+ [dayFocusedModifier, focusedDisabledModifiers],
94
+ [day6, {}]
95
+ ]);
96
+
97
+ const focusTarget = calculateFocusTarget(
98
+ days,
99
+ getModifiers,
100
+ isSelected,
101
+ dayLastFocused
102
+ );
103
+
104
+ expect(focusTarget).toBe(dayLastFocused);
105
+ });
106
+
107
+ it("should prioritize the selected day if no day is focused or last focused", () => {
108
+ const getModifiers = getModifiersFactory([
109
+ [day1, outsideModifiers],
110
+ [dayToday, todayModifiers],
111
+ [daySelected, {}],
112
+ [dayLastFocused, disabledModifiers],
113
+ [dayFocusedModifier, focusedDisabledModifiers],
114
+ [day6, {}]
115
+ ]);
116
+
117
+ const focusTarget = calculateFocusTarget(
118
+ days,
119
+ getModifiers,
120
+ isSelected,
121
+ dayLastFocused
122
+ );
123
+
124
+ expect(focusTarget).toBe(daySelected);
125
+ });
126
+
127
+ it("should prioritize today if no day is focused, last focused, or selected", () => {
128
+ const getModifiers = getModifiersFactory([
129
+ [day1, outsideModifiers],
130
+ [dayToday, todayModifiers],
131
+ [daySelected, hiddenModifiers],
132
+ [dayLastFocused, disabledModifiers],
133
+ [dayFocusedModifier, focusedDisabledModifiers],
134
+ [day6, {}]
135
+ ]);
136
+
137
+ const focusTarget = calculateFocusTarget(
138
+ days,
139
+ getModifiers,
140
+ isSelected,
141
+ dayLastFocused
142
+ );
143
+
144
+ expect(focusTarget).toBe(dayToday);
145
+ });
146
+
147
+ it("should fall back to the first focusable day if no other priority is met", () => {
148
+ const getModifiers = getModifiersFactory([
149
+ [day1, outsideModifiers],
150
+ [dayToday, todayHiddenModifiers],
151
+ [daySelected, hiddenModifiers],
152
+ [dayLastFocused, disabledModifiers],
153
+ [dayFocusedModifier, focusedDisabledModifiers],
154
+ [day6, {}]
155
+ ]);
156
+
157
+ const focusTarget = calculateFocusTarget(
158
+ days,
159
+ getModifiers,
160
+ isSelected,
161
+ dayLastFocused
162
+ );
163
+
164
+ expect(focusTarget).toBe(day6);
165
+ });
166
+ });
167
+ });
@@ -2,6 +2,21 @@ import { DayFlag } from "../UI.js";
2
2
  import type { CalendarDay } from "../classes/index.js";
3
3
  import type { Modifiers } from "../types/index.js";
4
4
 
5
+ enum FocusTargetPriority {
6
+ Today = 0,
7
+ Selected,
8
+ LastFocused,
9
+ FocusedModifier
10
+ }
11
+
12
+ function isFocusableDay(modifiers: Modifiers) {
13
+ return (
14
+ !modifiers[DayFlag.disabled] &&
15
+ !modifiers[DayFlag.hidden] &&
16
+ !modifiers[DayFlag.outside]
17
+ );
18
+ }
19
+
5
20
  export function calculateFocusTarget(
6
21
  days: CalendarDay[],
7
22
  getModifiers: (day: CalendarDay) => Modifiers,
@@ -10,42 +25,42 @@ export function calculateFocusTarget(
10
25
  ) {
11
26
  let focusTarget: CalendarDay | undefined;
12
27
 
13
- let index = 0;
14
- let found = false;
15
-
16
- while (index < days.length && !found) {
17
- const day = days[index];
28
+ let foundFocusTargetPriority: FocusTargetPriority | -1 = -1;
29
+ for (const day of days) {
18
30
  const modifiers = getModifiers(day);
19
31
 
20
- if (
21
- !modifiers[DayFlag.disabled] &&
22
- !modifiers[DayFlag.hidden] &&
23
- !modifiers[DayFlag.outside]
24
- ) {
25
- if (modifiers[DayFlag.focused]) {
32
+ if (isFocusableDay(modifiers)) {
33
+ if (
34
+ modifiers[DayFlag.focused] &&
35
+ foundFocusTargetPriority < FocusTargetPriority.FocusedModifier
36
+ ) {
26
37
  focusTarget = day;
27
- found = true;
28
- } else if (lastFocused?.isEqualTo(day)) {
38
+ foundFocusTargetPriority = FocusTargetPriority.FocusedModifier;
39
+ } else if (
40
+ lastFocused?.isEqualTo(day) &&
41
+ foundFocusTargetPriority < FocusTargetPriority.LastFocused
42
+ ) {
29
43
  focusTarget = day;
30
- found = true;
31
- } else if (isSelected(day.date)) {
44
+ foundFocusTargetPriority = FocusTargetPriority.LastFocused;
45
+ } else if (
46
+ isSelected(day.date) &&
47
+ foundFocusTargetPriority < FocusTargetPriority.Selected
48
+ ) {
32
49
  focusTarget = day;
33
- found = true;
34
- } else if (modifiers[DayFlag.today]) {
50
+ foundFocusTargetPriority = FocusTargetPriority.Selected;
51
+ } else if (
52
+ modifiers[DayFlag.today] &&
53
+ foundFocusTargetPriority < FocusTargetPriority.Today
54
+ ) {
35
55
  focusTarget = day;
36
- found = true;
56
+ foundFocusTargetPriority = FocusTargetPriority.Today;
37
57
  }
38
58
  }
39
-
40
- index++;
41
59
  }
42
60
 
43
61
  if (!focusTarget) {
44
62
  // return the first day that is focusable
45
- focusTarget = days.find((day) => {
46
- const m = getModifiers(day);
47
- return !m[DayFlag.disabled] && !m[DayFlag.hidden] && !m[DayFlag.outside];
48
- });
63
+ focusTarget = days.find((day) => isFocusableDay(getModifiers(day)));
49
64
  }
50
65
  return focusTarget;
51
66
  }
@@ -1,3 +1,5 @@
1
+ import { TZDate } from "@date-fns/tz";
2
+
1
3
  import { type DateLib } from "../classes/DateLib.js";
2
4
  import { type DayPickerProps } from "../types/props.js";
3
5
 
@@ -23,7 +25,8 @@ export function getInitialMonth(
23
25
  today = dateLib.today(),
24
26
  numberOfMonths = 1,
25
27
  endMonth,
26
- startMonth
28
+ startMonth,
29
+ timeZone
27
30
  } = props;
28
31
  let initialMonth = month || defaultMonth || today;
29
32
  const { differenceInCalendarMonths, addMonths, startOfMonth } = dateLib;
@@ -37,5 +40,8 @@ export function getInitialMonth(
37
40
  if (startMonth && differenceInCalendarMonths(initialMonth, startMonth) < 0) {
38
41
  initialMonth = startMonth;
39
42
  }
43
+ // When timeZone is provided, convert initialMonth to TZDate type to ensure proper timezone handling
44
+ initialMonth = timeZone ? new TZDate(initialMonth, timeZone) : initialMonth;
45
+
40
46
  return startOfMonth(initialMonth);
41
47
  }