@synerise/ds-date-range-picker 2.0.1 → 2.0.3

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.0.3](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.2...@synerise/ds-date-range-picker@2.0.3) (2026-09-07)
7
+
8
+ **Note:** Version bump only for package @synerise/ds-date-range-picker
9
+
10
+ ## [2.0.2](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.1...@synerise/ds-date-range-picker@2.0.2) (2026-09-02)
11
+
12
+ **Note:** Version bump only for package @synerise/ds-date-range-picker
13
+
6
14
  ## [2.0.1](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.0...@synerise/ds-date-range-picker@2.0.1) (2026-09-01)
7
15
 
8
16
  **Note:** Version bump only for package @synerise/ds-date-range-picker
package/CLAUDE.md CHANGED
@@ -196,7 +196,7 @@ Addons (relative picker, filter) appear below the calendar and are toggled via `
196
196
 
197
197
  ## Key dependencies
198
198
 
199
- - `react-day-picker ^7` — calendar grid rendering inside `RangePicker`
199
+ - `react-day-picker ^10` — calendar grid rendering inside `RangePicker` (see the v10 notes in `ds-date-picker`'s CLAUDE.md; day cells now contain a `<button class="DayPicker-Day-Button">`)
200
200
  - `@synerise/ds-popover` — floating popover (floating-ui underneath)
201
201
  - `date-fns ^2` + `date-fns-tz 1.1.4` — date arithmetic and timezone support
202
202
  - `dayjs ^1.8` — used in parts of `RangeFilter`
@@ -210,6 +210,7 @@ Addons (relative picker, filter) appear below the calendar and are toggled via `
210
210
  - `valueTransformer` is applied inside `RawDateRangePicker` before calling `onApply` — default transformer strips `ALL_TIME`-specific props.
211
211
  - `forceAbsolute` converts relative `DateRange` values to absolute bounds before emitting — useful when downstream systems don't understand relative types.
212
212
  - `RangePicker` (absolute calendar) is a class-based `PureComponent` — avoid passing new function references on every render to prevent unnecessary re-renders.
213
+ - `getModifiers()` in `RangePicker/utils.ts` returns react-day-picker `Matcher`s keyed by modifier name; each key becomes a `DayPicker-Day--<key>` class. It normalises the `Date | string | null` range bounds to `Date`, which the v7 code did with casts.
213
214
  - `RelativeRangePicker` is also a class-based `PureComponent`.
214
215
  - The `SINCE` mode is a variant of relative dating anchored to a specific timestamp rather than "now".
215
216
  - `normalizeRange()` from `utils` converts relative ranges to absolute `Date` objects — used internally and safe to call from consuming code.
@@ -10,7 +10,7 @@ const Container = /* @__PURE__ */ styled.div.withConfig({
10
10
  const Row = /* @__PURE__ */ styled.div.withConfig({
11
11
  displayName: "RangeFormstyles__Row",
12
12
  componentId: "sc-4k3o5r-2"
13
- })(["width:100%;display:flex;justify-content:", ";min-height:32px;margin:8px 0;", " .ant-slider{width:100%;margin:24px 8px 8px;}.ant-tooltip-inner{white-space:nowrap;}&& .ant-slider-handle:focus,&& .ant-slider-handle:hover{.ant-tooltip-content{background-color:transparent;}.ant-tooltip-inner{color:", ";}}"], (props) => props.justifyContent, (props) => props.mode === "slider" && css(["&{column-gap:8px;margin-top:16px;", "{margin-top:14px;}}"], RemoveIconWrapper), (props) => props.theme.palette["grey-600"]);
13
+ })(["width:100%;display:flex;justify-content:", ";min-height:32px;margin:8px 0;", " .ant-slider{width:100%;margin:24px 8px 8px;}"], (props) => props.justifyContent, (props) => props.mode === "slider" && css(["&{column-gap:8px;margin-top:16px;", "{margin-top:14px;}}"], RemoveIconWrapper));
14
14
  const Separator = /* @__PURE__ */ styled.span.withConfig({
15
15
  displayName: "RangeFormstyles__Separator",
16
16
  componentId: "sc-4k3o5r-3"
@@ -2,7 +2,6 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import fnsIsSameDay from "date-fns/isSameDay";
3
3
  import fnsIsValid from "date-fns/isValid";
4
4
  import { PureComponent } from "react";
5
- import { DateUtils } from "react-day-picker";
6
5
  import { legacyParse } from "@date-fns/upgrade/v2";
7
6
  import { withDataFormat, getDefaultDataTimeOptions } from "@synerise/ds-core";
8
7
  import { YearPicker, MonthPicker, fnsDifferenceInYears, DayPicker, localeUtils, TimePicker, datePickerFormat } from "@synerise/ds-date-picker";
@@ -25,7 +24,7 @@ import "date-fns/endOfMonth";
25
24
  import "date-fns/format";
26
25
  import "date-fns/getYear";
27
26
  import fnsIsAfter from "date-fns/isAfter";
28
- import "date-fns/isBefore";
27
+ import fnsIsBefore from "date-fns/isBefore";
29
28
  import fnsIsSameMonth from "date-fns/isSameMonth";
30
29
  import "date-fns/isSameYear";
31
30
  import "date-fns/setDate";
@@ -35,6 +34,7 @@ import fnsStartOfDay from "date-fns/startOfDay";
35
34
  import "date-fns/startOfMonth";
36
35
  import { Sides, Side, PickerFooter, FooterSeparator, DateTimeModeSwitch } from "./RangePicker.styles.js";
37
36
  import { getModifiers, getDisabledTimeOptions, getSidesState } from "./utils.js";
37
+ const isDayBefore = (day, reference) => fnsIsBefore(fnsStartOfDay(day), fnsStartOfDay(reference));
38
38
  const NOOP = () => {
39
39
  };
40
40
  const TOOLTIP_FORMAT = "MMM d, yyyy, HH:mm";
@@ -51,10 +51,10 @@ function replaceRange(value, day) {
51
51
  }
52
52
  if (!from) {
53
53
  from = day;
54
- } else if (from && to && DateUtils.isSameDay(from, to) && DateUtils.isSameDay(day, from)) {
54
+ } else if (from && to && fnsIsSameDay(from, to) && fnsIsSameDay(day, from)) {
55
55
  from = null;
56
56
  to = null;
57
- } else if (to && DateUtils.isSameDay(day, to)) {
57
+ } else if (to && fnsIsSameDay(day, to)) {
58
58
  from = day;
59
59
  to = day;
60
60
  } else if (from && to) {
@@ -62,7 +62,7 @@ function replaceRange(value, day) {
62
62
  to = null;
63
63
  } else {
64
64
  to = day;
65
- if (DateUtils.isDayBefore(to, from)) {
65
+ if (isDayBefore(to, from)) {
66
66
  to = from;
67
67
  from = day;
68
68
  }
@@ -229,7 +229,7 @@ class RangePicker extends PureComponent {
229
229
  } = value;
230
230
  const rangeFrom = from ? legacyParse(from) : null;
231
231
  const rangeTo = to ? legacyParse(to) : null;
232
- const isSelectedRangeDay = !!rangeFrom && !!rangeTo && fnsIsValid(rangeFrom) && fnsIsValid(rangeTo) && !DateUtils.isDayBefore(day, rangeFrom) && !DateUtils.isDayBefore(rangeTo, day);
232
+ const isSelectedRangeDay = !!rangeFrom && !!rangeTo && fnsIsValid(rangeFrom) && fnsIsValid(rangeTo) && !isDayBefore(day, rangeFrom) && !isDayBefore(rangeTo, day);
233
233
  const dayForeground = /* @__PURE__ */ jsx(DayForeground, { className: "DayPicker-Day-FG" });
234
234
  return /* @__PURE__ */ jsxs(Fragment, { children: [
235
235
  /* @__PURE__ */ jsx(DayBackground, { className: "DayPicker-Day-BG" }),
@@ -273,44 +273,15 @@ class RangePicker extends PureComponent {
273
273
  type
274
274
  } = value;
275
275
  const modifiers = getModifiers(fnsIsValid(from) ? from : null, fnsIsValid(to) ? to : null, enteredTo);
276
- const selectedDays = fnsIsValid(from) && fnsIsValid(to) ? [from, {
277
- from,
278
- to
279
- }] : [void 0, {
280
- from: void 0,
281
- to: void 0
282
- }];
276
+ const selectedDays = fnsIsValid(from) && fnsIsValid(to) ? [legacyParse(from), {
277
+ from: legacyParse(from),
278
+ to: legacyParse(to)
279
+ }] : [];
283
280
  const parsedLeft = legacyParse(left.month);
284
281
  const parsedRight = legacyParse(right.month);
285
282
  const adjacentMonths = forceAdjacentMonths || fnsIsSameMonth(ADD.MONTHS(parsedLeft, 1), parsedRight);
286
283
  const adjacentYears = forceAdjacentMonths || fnsDifferenceInYears(ADD.MONTHS(parsedLeft, 1), parsedRight) === 0;
287
- return /* @__PURE__ */ jsx(
288
- DayPicker,
289
- {
290
- className: type.toLowerCase(),
291
- canChangeMonth: false,
292
- disabledDays: disabledDate,
293
- localeUtils,
294
- month: getDateFromString(sideState.month),
295
- title: sideState.monthTitle,
296
- hideLongNext: side === COLUMNS.LEFT && adjacentYears,
297
- hideShortNext: side === COLUMNS.LEFT && adjacentMonths,
298
- hideLongPrev: side === COLUMNS.RIGHT && adjacentYears,
299
- hideShortPrev: side === COLUMNS.RIGHT && adjacentMonths,
300
- renderDay: this.renderDay,
301
- onDayMouseEnter: this.handleDayMouseEnter,
302
- onDayMouseLeave: this.handleDayMouseLeave,
303
- onMonthNameClick: () => this.handleSideModeChange(side, "month"),
304
- onYearNameClick: () => this.handleSideModeChange(side, "year"),
305
- onMonthChange: (month) => this.handleSideMonthChange(side, month, "date"),
306
- fixedWeeks: true,
307
- showOutsideDay: true,
308
- modifiers,
309
- onDayClick: this.handleDayClick,
310
- selectedDays
311
- },
312
- `day_picker_${side}`
313
- );
284
+ return /* @__PURE__ */ jsx(DayPicker, { className: type.toLowerCase(), canChangeMonth: false, disabledDays: disabledDate, localeUtils, month: getDateFromString(sideState.month), title: sideState.monthTitle, hideLongNext: side === COLUMNS.LEFT && adjacentYears, hideShortNext: side === COLUMNS.LEFT && adjacentMonths, hideLongPrev: side === COLUMNS.RIGHT && adjacentYears, hideShortPrev: side === COLUMNS.RIGHT && adjacentMonths, renderDay: this.renderDay, onDayMouseEnter: this.handleDayMouseEnter, onDayMouseLeave: this.handleDayMouseLeave, onMonthNameClick: () => this.handleSideModeChange(side, "month"), onYearNameClick: () => this.handleSideModeChange(side, "year"), onMonthChange: (month) => this.handleSideMonthChange(side, month, "date"), fixedWeeks: true, showOutsideDays: true, modifiers, onDayClick: this.handleDayClick, selectedDays }, `day_picker_${side}`);
314
285
  };
315
286
  this.renderTimePicker = (side) => {
316
287
  const {
@@ -1,6 +1,6 @@
1
- import { Modifiers } from 'react-day-picker';
1
+ import { Matcher } from 'react-day-picker';
2
2
  import { DateRange, NullableDateLimit } from '../date.types';
3
3
  import { State } from './RangePicker.types';
4
4
  export declare const getDisabledTimeOptions: (initialDay: string | Date | undefined, granularity: string, initialLowerLimit?: NullableDateLimit, initialUpperLimit?: NullableDateLimit, is12HoursClock?: boolean) => number[];
5
5
  export declare const getSidesState: (value: DateRange, forceAdjacentMonths?: boolean) => State;
6
- export declare const getModifiers: (from: NullableDateLimit | undefined, to: NullableDateLimit | undefined, enteredTo: NullableDateLimit | undefined) => Modifiers;
6
+ export declare const getModifiers: (from: NullableDateLimit | undefined, to: NullableDateLimit | undefined, enteredTo: NullableDateLimit | undefined) => Record<string, Matcher | undefined>;
@@ -122,6 +122,12 @@ const getSidesState = (value, forceAdjacentMonths) => {
122
122
  }
123
123
  };
124
124
  };
125
+ const toDate = (value) => {
126
+ if (value === null || value === void 0) {
127
+ return void 0;
128
+ }
129
+ return value instanceof Date ? value : legacyParse(value);
130
+ };
125
131
  const getModifiers = (from, to, enteredTo) => {
126
132
  const isSelecting = from && !to && enteredTo;
127
133
  const enteredStart = isSelecting ? fnsMin([legacyParse(from), legacyParse(enteredTo)]) : enteredTo;
@@ -133,15 +139,14 @@ const getModifiers = (from, to, enteredTo) => {
133
139
  const startModifier = isSelecting && !!enteredTo && !!from && enteredTo < from ? void 0 : from;
134
140
  const endModifier = isSelecting && !!enteredTo && !!from && enteredTo < from ? from : to;
135
141
  return {
136
- start: startModifier,
137
- end: endModifier,
138
- entered,
139
- outside: void 0,
142
+ start: toDate(startModifier),
143
+ end: toDate(endModifier),
144
+ entered: typeof entered === "function" ? entered : toDate(entered),
140
145
  today: NOW,
141
- "entered-start": enteredStart,
142
- "entered-end": enteredEnd,
143
- "initial-entered": !endModifier ? startModifier : void 0,
144
- initial: !entered && !endModifier ? startModifier : void 0
146
+ "entered-start": toDate(enteredStart),
147
+ "entered-end": toDate(enteredEnd),
148
+ "initial-entered": !endModifier ? toDate(startModifier) : void 0,
149
+ initial: !entered && !endModifier ? toDate(startModifier) : void 0
145
150
  };
146
151
  };
147
152
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-date-range-picker",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "Date-Range-Picker UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -43,25 +43,25 @@
43
43
  "types": "dist/index.d.ts",
44
44
  "dependencies": {
45
45
  "@date-fns/upgrade": "^1.0.3",
46
- "@synerise/ds-badge": "^2.0.0",
47
- "@synerise/ds-button": "^2.0.0",
48
- "@synerise/ds-button-group": "^2.0.0",
49
- "@synerise/ds-date-picker": "^2.0.0",
50
- "@synerise/ds-dropdown": "^2.0.0",
51
- "@synerise/ds-form-field": "^2.0.0",
52
- "@synerise/ds-icon": "^2.0.0",
53
- "@synerise/ds-inline-edit": "^2.0.0",
54
- "@synerise/ds-input": "^2.0.0",
55
- "@synerise/ds-input-number": "^2.0.0",
56
- "@synerise/ds-list-item": "^2.0.0",
57
- "@synerise/ds-manageable-list": "^2.0.0",
46
+ "@synerise/ds-badge": "^2.0.1",
47
+ "@synerise/ds-button": "^2.0.1",
48
+ "@synerise/ds-button-group": "^2.0.1",
49
+ "@synerise/ds-date-picker": "^2.0.2",
50
+ "@synerise/ds-dropdown": "^2.0.2",
51
+ "@synerise/ds-form-field": "^2.0.1",
52
+ "@synerise/ds-icon": "^2.1.0",
53
+ "@synerise/ds-inline-edit": "^2.0.2",
54
+ "@synerise/ds-input": "^2.0.2",
55
+ "@synerise/ds-input-number": "^2.0.2",
56
+ "@synerise/ds-list-item": "^2.0.1",
57
+ "@synerise/ds-manageable-list": "^2.0.2",
58
58
  "@synerise/ds-popover": "^2.0.0",
59
- "@synerise/ds-scrollbar": "^2.0.0",
60
- "@synerise/ds-select": "^2.0.1",
61
- "@synerise/ds-slider": "^2.0.0",
62
- "@synerise/ds-tag": "^2.0.0",
63
- "@synerise/ds-time-picker": "^2.0.0",
64
- "@synerise/ds-tooltip": "^2.0.0",
59
+ "@synerise/ds-scrollbar": "^2.0.1",
60
+ "@synerise/ds-select": "^2.0.3",
61
+ "@synerise/ds-slider": "^2.0.1",
62
+ "@synerise/ds-tag": "^2.0.1",
63
+ "@synerise/ds-time-picker": "^2.0.2",
64
+ "@synerise/ds-tooltip": "^2.0.1",
65
65
  "@synerise/ds-utils": "^2.0.0",
66
66
  "date-fns": "^2.16.1",
67
67
  "date-fns-tz": "1.1.4",
@@ -78,7 +78,7 @@
78
78
  "lodash.reverse": "^4.0.1",
79
79
  "lodash.values": "^4.3.0",
80
80
  "ramda": "^0.27.0",
81
- "react-day-picker": "^7.4.8",
81
+ "react-day-picker": "^10.0.1",
82
82
  "uuid": "^8.3.2"
83
83
  },
84
84
  "devDependencies": {
@@ -102,5 +102,5 @@
102
102
  "react-intl": ">=3.12.0 <= 6.8",
103
103
  "styled-components": "^5.3.3"
104
104
  },
105
- "gitHead": "a57eb7eaf98318b364468368d1aa4fd9fa6a6dc8"
105
+ "gitHead": "788eba77544b291f7e938864a3994df4b4d904e2"
106
106
  }