@osdk/react-components 0.21.0 → 0.21.1-main-d20976242ef20c16cb57f76e9439ab3d4a9fd36e

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 (105) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/browser/shared/calendar/DateCalendar.js +27 -4
  3. package/build/browser/shared/calendar/DateCalendar.js.map +1 -1
  4. package/build/browser/shared/calendar/DatePicker.js +4 -17
  5. package/build/browser/shared/calendar/DatePicker.js.map +1 -1
  6. package/build/browser/shared/calendar/DatePicker.module.css +0 -5
  7. package/build/browser/shared/calendar/DatePicker.module.css.js +1 -2
  8. package/build/browser/shared/calendar/DateRangePicker.js +4 -2
  9. package/build/browser/shared/calendar/DateRangePicker.js.map +1 -1
  10. package/build/browser/shared/calendar/TimePicker.js +24 -45
  11. package/build/browser/shared/calendar/TimePicker.js.map +1 -1
  12. package/build/browser/styles.css +0 -5
  13. package/build/browser/util/UserAgent.js +1 -1
  14. package/build/browser/util/UserAgent.js.map +1 -1
  15. package/build/cjs/{DateCalendar-OLI4WF2E.cjs → DateCalendar-PZO23MYM.cjs} +6 -6
  16. package/build/cjs/{DateCalendar-OLI4WF2E.cjs.map → DateCalendar-PZO23MYM.cjs.map} +1 -1
  17. package/build/cjs/{DateCalendar-7E5ZCI7U.css → DateCalendar-XTX3RI6O.css} +35 -1
  18. package/build/cjs/DateCalendar-XTX3RI6O.css.map +1 -0
  19. package/build/cjs/DateRangeCalendar-2MBQAU3Z.cjs +12 -0
  20. package/build/cjs/{DateRangeCalendar-TC7G2J2D.cjs.map → DateRangeCalendar-2MBQAU3Z.cjs.map} +1 -1
  21. package/build/cjs/{DateRangeCalendar-R3RYMAD4.css → DateRangeCalendar-R7KHDKJT.css} +35 -1
  22. package/build/cjs/DateRangeCalendar-R7KHDKJT.css.map +1 -0
  23. package/build/cjs/{chunk-53QFFROW.cjs → chunk-3H7C6RMF.cjs} +4 -4
  24. package/build/cjs/{chunk-53QFFROW.cjs.map → chunk-3H7C6RMF.cjs.map} +1 -1
  25. package/build/cjs/{chunk-Y6BGC7DP.cjs → chunk-3S52UDZM.cjs} +22 -22
  26. package/build/cjs/{chunk-Y6BGC7DP.cjs.map → chunk-3S52UDZM.cjs.map} +1 -1
  27. package/build/cjs/{chunk-TIFUKHW7.cjs → chunk-4TXNAWFI.cjs} +3 -3
  28. package/build/cjs/chunk-4TXNAWFI.cjs.map +1 -0
  29. package/build/cjs/{chunk-RHIG474S.cjs → chunk-5LAEKDKK.cjs} +4 -4
  30. package/build/cjs/{chunk-RHIG474S.cjs.map → chunk-5LAEKDKK.cjs.map} +1 -1
  31. package/build/cjs/{chunk-MZPKV7JC.cjs → chunk-5MKZ3BOU.cjs} +4 -4
  32. package/build/cjs/{chunk-MZPKV7JC.cjs.map → chunk-5MKZ3BOU.cjs.map} +1 -1
  33. package/build/cjs/chunk-767V4XT2.cjs +11 -0
  34. package/build/cjs/{chunk-DUQXYBH2.cjs.map → chunk-767V4XT2.cjs.map} +1 -1
  35. package/build/cjs/{chunk-FIM67ZE2.cjs → chunk-DAB2LPFK.cjs} +51 -51
  36. package/build/cjs/{chunk-FIM67ZE2.cjs.map → chunk-DAB2LPFK.cjs.map} +1 -1
  37. package/build/cjs/chunk-DE2WFN67.cjs +11 -0
  38. package/build/cjs/{chunk-VA2HOEKY.cjs.map → chunk-DE2WFN67.cjs.map} +1 -1
  39. package/build/cjs/{chunk-XA3S7YAO.cjs → chunk-E5OKIBYJ.cjs} +145 -317
  40. package/build/cjs/chunk-E5OKIBYJ.cjs.map +1 -0
  41. package/build/cjs/chunk-FAB2KBRR.cjs +11 -0
  42. package/build/cjs/{chunk-F2WUXH2W.cjs.map → chunk-FAB2KBRR.cjs.map} +1 -1
  43. package/build/cjs/{chunk-ZGW2CPEY.cjs → chunk-FTYNB3YF.cjs} +11 -11
  44. package/build/cjs/{chunk-ZGW2CPEY.cjs.map → chunk-FTYNB3YF.cjs.map} +1 -1
  45. package/build/cjs/{chunk-LBWASTWS.cjs → chunk-KPLJJZUF.cjs} +12 -12
  46. package/build/cjs/{chunk-LBWASTWS.cjs.map → chunk-KPLJJZUF.cjs.map} +1 -1
  47. package/build/cjs/chunk-NE7GRF7G.cjs +366 -0
  48. package/build/cjs/chunk-NE7GRF7G.cjs.map +1 -0
  49. package/build/cjs/chunk-PG46DLZI.cjs +11 -0
  50. package/build/cjs/{chunk-XBIJFLHM.cjs.map → chunk-PG46DLZI.cjs.map} +1 -1
  51. package/build/cjs/{chunk-5XDYMIRI.cjs → chunk-QSVNGTXV.cjs} +17 -17
  52. package/build/cjs/{chunk-5XDYMIRI.cjs.map → chunk-QSVNGTXV.cjs.map} +1 -1
  53. package/build/cjs/chunk-S67TNE3N.cjs +11 -0
  54. package/build/cjs/{chunk-JOVWU475.cjs.map → chunk-S67TNE3N.cjs.map} +1 -1
  55. package/build/cjs/{chunk-7NQZT4VM.cjs → chunk-XKD7L2LV.cjs} +4 -4
  56. package/build/cjs/{chunk-7NQZT4VM.cjs.map → chunk-XKD7L2LV.cjs.map} +1 -1
  57. package/build/cjs/public/experimental/action-form.cjs +8 -8
  58. package/build/cjs/public/experimental/action-form.css +34 -38
  59. package/build/cjs/public/experimental/action-form.css.map +1 -1
  60. package/build/cjs/public/experimental/document-viewer.cjs +4 -4
  61. package/build/cjs/public/experimental/email-viewer.cjs +3 -3
  62. package/build/cjs/public/experimental/excel-viewer.cjs +3 -3
  63. package/build/cjs/public/experimental/filter-list.cjs +17 -17
  64. package/build/cjs/public/experimental/filter-list.css +34 -38
  65. package/build/cjs/public/experimental/filter-list.css.map +1 -1
  66. package/build/cjs/public/experimental/image-viewer.cjs +3 -3
  67. package/build/cjs/public/experimental/markdown-renderer.cjs +3 -3
  68. package/build/cjs/public/experimental/object-table.cjs +12 -12
  69. package/build/cjs/public/experimental/object-table.css +34 -38
  70. package/build/cjs/public/experimental/object-table.css.map +1 -1
  71. package/build/cjs/public/experimental/pdf-viewer.cjs +7 -7
  72. package/build/cjs/public/experimental/tiff-renderer.cjs +3 -3
  73. package/build/cjs/public/experimental/video-viewer.cjs +3 -3
  74. package/build/cjs/public/experimental/xml-viewer.cjs +3 -3
  75. package/build/cjs/public/experimental.cjs +51 -51
  76. package/build/cjs/public/experimental.css +34 -38
  77. package/build/cjs/public/experimental.css.map +1 -1
  78. package/build/esm/shared/calendar/DateCalendar.js +27 -4
  79. package/build/esm/shared/calendar/DateCalendar.js.map +1 -1
  80. package/build/esm/shared/calendar/DatePicker.js +4 -17
  81. package/build/esm/shared/calendar/DatePicker.js.map +1 -1
  82. package/build/esm/shared/calendar/DatePicker.module.css +0 -5
  83. package/build/esm/shared/calendar/DateRangePicker.js +4 -2
  84. package/build/esm/shared/calendar/DateRangePicker.js.map +1 -1
  85. package/build/esm/shared/calendar/TimePicker.js +24 -45
  86. package/build/esm/shared/calendar/TimePicker.js.map +1 -1
  87. package/build/esm/util/UserAgent.js +1 -1
  88. package/build/esm/util/UserAgent.js.map +1 -1
  89. package/build/types/shared/calendar/DateCalendar.d.ts +2 -2
  90. package/build/types/shared/calendar/DateCalendar.d.ts.map +1 -1
  91. package/build/types/shared/calendar/DatePicker.d.ts.map +1 -1
  92. package/build/types/shared/calendar/TimePicker.d.ts.map +1 -1
  93. package/package.json +4 -4
  94. package/build/cjs/DateCalendar-7E5ZCI7U.css.map +0 -1
  95. package/build/cjs/DateRangeCalendar-R3RYMAD4.css.map +0 -1
  96. package/build/cjs/DateRangeCalendar-TC7G2J2D.cjs +0 -12
  97. package/build/cjs/chunk-DUQXYBH2.cjs +0 -11
  98. package/build/cjs/chunk-F2WUXH2W.cjs +0 -11
  99. package/build/cjs/chunk-JBRNNWYC.cjs +0 -197
  100. package/build/cjs/chunk-JBRNNWYC.cjs.map +0 -1
  101. package/build/cjs/chunk-JOVWU475.cjs +0 -11
  102. package/build/cjs/chunk-TIFUKHW7.cjs.map +0 -1
  103. package/build/cjs/chunk-VA2HOEKY.cjs +0 -11
  104. package/build/cjs/chunk-XA3S7YAO.cjs.map +0 -1
  105. package/build/cjs/chunk-XBIJFLHM.cjs +0 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @osdk/react-components
2
2
 
3
+ ## 0.21.1-main-d20976242ef20c16cb57f76e9439ab3d4a9fd36e
4
+
5
+ ### Patch Changes
6
+
7
+ - d209762: Reset datetime picker time to the current wall-clock time when clicking Today.
8
+
3
9
  ## 0.21.0
4
10
 
5
11
  ### Minor Changes
@@ -22,6 +22,7 @@ import { ActionButton } from "../../base-components/action-button/ActionButton.j
22
22
  import { isDateInRange } from "../../shared/dateUtils.js";
23
23
  import { buildDisabledMatchers, DEFAULT_FROM_YEAR, DEFAULT_TO_YEAR } from "./calendarShared.js";
24
24
  import styles from "./DateCalendar.module.css.js";
25
+ import { TimePicker } from "./TimePicker.js";
25
26
  export const CLASS_NAMES = {
26
27
  root: styles.calendar,
27
28
  months: styles.calendarMonths,
@@ -65,16 +66,17 @@ export const CALENDAR_COMPONENTS = {
65
66
  export default function DateCalendar({
66
67
  dateSelected,
67
68
  onSelect,
69
+ onTimeChange,
68
70
  onClear,
69
71
  month,
70
72
  onMonthChange,
71
73
  min,
72
74
  max,
73
- footer,
74
75
  todayButtonText = "Today",
75
76
  clearButtonText = "Clear"
76
77
  }) {
77
78
  const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);
79
+ const showTime = onTimeChange != null;
78
80
  const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;
79
81
  const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;
80
82
  const today = new Date();
@@ -82,15 +84,36 @@ export default function DateCalendar({
82
84
  // set to today's date at midnight (the common case for date-only bounds).
83
85
  const todayMidnight = new Date(today.getFullYear(), today.getMonth(), today.getDate());
84
86
  const isTodaySelectable = isDateInRange(todayMidnight, min, max);
87
+ const applySelectedTime = useCallback(selected => {
88
+ // Calendar day buttons provide local-midnight dates. In datetime mode,
89
+ // keep the currently visible time when the user changes only the day.
90
+ // The Today action intentionally bypasses this path and uses wall-clock
91
+ // time from `new Date()`.
92
+ if (!showTime) {
93
+ return selected;
94
+ }
95
+ if (dateSelected == null) {
96
+ return selected;
97
+ }
98
+ const date = new Date(selected.getTime());
99
+ date.setHours(dateSelected.getHours(), dateSelected.getMinutes(), 0, 0);
100
+ return date;
101
+ }, [dateSelected, showTime]);
102
+ const handleSelect = useCallback(selected => {
103
+ onSelect(selected == null ? undefined : applySelectedTime(selected));
104
+ }, [applySelectedTime, onSelect]);
85
105
  const handleTodayClick = useCallback(() => {
86
106
  if (!isTodaySelectable) {
87
107
  return;
88
108
  }
89
109
  onSelect(new Date());
90
110
  }, [isTodaySelectable, onSelect]);
91
- const calendarFooter = /*#__PURE__*/React.createElement(React.Fragment, null, footer != null && /*#__PURE__*/React.createElement("div", {
111
+ const calendarFooter = /*#__PURE__*/React.createElement(React.Fragment, null, showTime && /*#__PURE__*/React.createElement("div", {
92
112
  className: styles.calendarTimeFooter
93
- }, footer), /*#__PURE__*/React.createElement("div", {
113
+ }, /*#__PURE__*/React.createElement(TimePicker, {
114
+ value: dateSelected ?? null,
115
+ onChange: onTimeChange
116
+ })), /*#__PURE__*/React.createElement("div", {
94
117
  className: styles.calendarActionBar
95
118
  }, /*#__PURE__*/React.createElement(ActionButton, {
96
119
  type: "button",
@@ -105,7 +128,7 @@ export default function DateCalendar({
105
128
  return /*#__PURE__*/React.createElement(DayPicker, {
106
129
  mode: "single",
107
130
  selected: dateSelected,
108
- onSelect: onSelect,
131
+ onSelect: handleSelect,
109
132
  month: month,
110
133
  onMonthChange: onMonthChange,
111
134
  disabled: disabled,
@@ -1 +1 @@
1
- {"version":3,"file":"DateCalendar.js","names":["ChevronLeft","ChevronRight","classnames","React","useCallback","useMemo","DayPicker","ActionButton","isDateInRange","buildDisabledMatchers","DEFAULT_FROM_YEAR","DEFAULT_TO_YEAR","styles","CLASS_NAMES","root","calendar","months","calendarMonths","table","calendarMonthGrid","head_cell","calendarWeekday","cell","calendarDay","day","calendarDayButton","day_selected","calendarSelected","day_today","calendarToday","day_outside","calendarOutside","day_disabled","calendarDisabled","day_hidden","calendarHidden","nav","calendarNav","nav_button_previous","calendarNavButton","calendarNavPrev","nav_button_next","calendarNavNext","caption","calendarMonthCaption","caption_label","calendarVhidden","caption_dropdowns","calendarCaptionDropdowns","dropdown","calendarDropdown","dropdown_month","dropdown_year","nav_icon","calendarChevron","vhidden","tfoot","calendarFooter","NAV_ICON_SIZE","IconLeft","createElement","size","IconRight","CALENDAR_COMPONENTS","DateCalendar","dateSelected","onSelect","onClear","month","onMonthChange","min","max","footer","todayButtonText","clearButtonText","disabled","fromYear","getFullYear","toYear","today","Date","todayMidnight","getMonth","getDate","isTodaySelectable","handleTodayClick","Fragment","className","calendarTimeFooter","calendarActionBar","type","appearance","onClick","mode","selected","defaultMonth","classNames","components","captionLayout","showOutsideDays","fixedWeeks"],"sources":["DateCalendar.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChevronLeft, ChevronRight } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { ClassNames } from \"react-day-picker\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ActionButton } from \"../../base-components/action-button/ActionButton.js\";\nimport { isDateInRange } from \"../../shared/dateUtils.js\";\nimport {\n buildDisabledMatchers,\n DEFAULT_FROM_YEAR,\n DEFAULT_TO_YEAR,\n} from \"./calendarShared.js\";\nimport styles from \"./DateCalendar.module.css\";\n\nexport const CLASS_NAMES: ClassNames = {\n root: styles.calendar,\n months: styles.calendarMonths,\n table: styles.calendarMonthGrid,\n head_cell: styles.calendarWeekday,\n cell: styles.calendarDay,\n day: styles.calendarDayButton,\n day_selected: styles.calendarSelected,\n day_today: styles.calendarToday,\n day_outside: styles.calendarOutside,\n day_disabled: styles.calendarDisabled,\n day_hidden: styles.calendarHidden,\n nav: styles.calendarNav,\n nav_button_previous: classnames(\n styles.calendarNavButton,\n styles.calendarNavPrev,\n ),\n nav_button_next: classnames(styles.calendarNavButton, styles.calendarNavNext),\n caption: styles.calendarMonthCaption,\n caption_label: styles.calendarVhidden,\n caption_dropdowns: styles.calendarCaptionDropdowns,\n dropdown: styles.calendarDropdown,\n dropdown_month: styles.calendarDropdown,\n dropdown_year: styles.calendarDropdown,\n nav_icon: styles.calendarChevron,\n vhidden: styles.calendarVhidden,\n tfoot: styles.calendarFooter,\n};\n\nconst NAV_ICON_SIZE = 12;\n\nfunction IconLeft(): React.ReactElement {\n return <ChevronLeft size={NAV_ICON_SIZE} />;\n}\n\nfunction IconRight(): React.ReactElement {\n return <ChevronRight size={NAV_ICON_SIZE} />;\n}\n\nexport const CALENDAR_COMPONENTS: {\n IconLeft: () => React.ReactElement;\n IconRight: () => React.ReactElement;\n} = { IconLeft, IconRight };\n\nexport interface DateCalendarProps {\n dateSelected: Date | undefined;\n onSelect: (date: Date | undefined) => void;\n onClear?: () => void;\n month?: Date;\n onMonthChange?: (month: Date) => void;\n min?: Date;\n max?: Date;\n footer?: React.ReactNode;\n todayButtonText?: string;\n clearButtonText?: string;\n}\n\nexport default function DateCalendar({\n dateSelected,\n onSelect,\n onClear,\n month,\n onMonthChange,\n min,\n max,\n footer,\n todayButtonText = \"Today\",\n clearButtonText = \"Clear\",\n}: DateCalendarProps): React.ReactElement {\n const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);\n\n const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;\n const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;\n const today = new Date();\n // Compare at midnight so the Today button stays enabled when min/max are\n // set to today's date at midnight (the common case for date-only bounds).\n const todayMidnight = new Date(\n today.getFullYear(),\n today.getMonth(),\n today.getDate(),\n );\n const isTodaySelectable = isDateInRange(todayMidnight, min, max);\n const handleTodayClick = useCallback(() => {\n if (!isTodaySelectable) {\n return;\n }\n onSelect(new Date());\n }, [isTodaySelectable, onSelect]);\n\n const calendarFooter = (\n <>\n {footer != null && (\n <div className={styles.calendarTimeFooter}>{footer}</div>\n )}\n <div className={styles.calendarActionBar}>\n <ActionButton\n type=\"button\"\n appearance=\"minimal\"\n disabled={!isTodaySelectable}\n onClick={handleTodayClick}\n >\n {todayButtonText}\n </ActionButton>\n {onClear != null && (\n <ActionButton type=\"button\" appearance=\"minimal\" onClick={onClear}>\n {clearButtonText}\n </ActionButton>\n )}\n </div>\n </>\n );\n\n return (\n <DayPicker\n mode=\"single\"\n selected={dateSelected}\n onSelect={onSelect}\n month={month}\n onMonthChange={onMonthChange}\n disabled={disabled}\n defaultMonth={dateSelected}\n classNames={CLASS_NAMES}\n components={CALENDAR_COMPONENTS}\n footer={calendarFooter}\n // Render month/year as dropdown selects + prev/next arrows,\n // so users can jump directly to any month/year without paging.\n captionLayout=\"dropdown-buttons\"\n fromYear={fromYear}\n toYear={toYear}\n showOutsideDays={true}\n // Always render 6 rows so the calendar height doesn't jump between months.\n fixedWeeks={true}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DateCalendar.js","names":["ChevronLeft","ChevronRight","classnames","React","useCallback","useMemo","DayPicker","ActionButton","isDateInRange","buildDisabledMatchers","DEFAULT_FROM_YEAR","DEFAULT_TO_YEAR","styles","TimePicker","CLASS_NAMES","root","calendar","months","calendarMonths","table","calendarMonthGrid","head_cell","calendarWeekday","cell","calendarDay","day","calendarDayButton","day_selected","calendarSelected","day_today","calendarToday","day_outside","calendarOutside","day_disabled","calendarDisabled","day_hidden","calendarHidden","nav","calendarNav","nav_button_previous","calendarNavButton","calendarNavPrev","nav_button_next","calendarNavNext","caption","calendarMonthCaption","caption_label","calendarVhidden","caption_dropdowns","calendarCaptionDropdowns","dropdown","calendarDropdown","dropdown_month","dropdown_year","nav_icon","calendarChevron","vhidden","tfoot","calendarFooter","NAV_ICON_SIZE","IconLeft","createElement","size","IconRight","CALENDAR_COMPONENTS","DateCalendar","dateSelected","onSelect","onTimeChange","onClear","month","onMonthChange","min","max","todayButtonText","clearButtonText","disabled","showTime","fromYear","getFullYear","toYear","today","Date","todayMidnight","getMonth","getDate","isTodaySelectable","applySelectedTime","selected","date","getTime","setHours","getHours","getMinutes","handleSelect","undefined","handleTodayClick","Fragment","className","calendarTimeFooter","value","onChange","calendarActionBar","type","appearance","onClick","mode","defaultMonth","classNames","components","footer","captionLayout","showOutsideDays","fixedWeeks"],"sources":["DateCalendar.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChevronLeft, ChevronRight } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { ClassNames } from \"react-day-picker\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ActionButton } from \"../../base-components/action-button/ActionButton.js\";\nimport { isDateInRange } from \"../../shared/dateUtils.js\";\nimport {\n buildDisabledMatchers,\n DEFAULT_FROM_YEAR,\n DEFAULT_TO_YEAR,\n} from \"./calendarShared.js\";\nimport styles from \"./DateCalendar.module.css\";\nimport { TimePicker } from \"./TimePicker.js\";\n\nexport const CLASS_NAMES: ClassNames = {\n root: styles.calendar,\n months: styles.calendarMonths,\n table: styles.calendarMonthGrid,\n head_cell: styles.calendarWeekday,\n cell: styles.calendarDay,\n day: styles.calendarDayButton,\n day_selected: styles.calendarSelected,\n day_today: styles.calendarToday,\n day_outside: styles.calendarOutside,\n day_disabled: styles.calendarDisabled,\n day_hidden: styles.calendarHidden,\n nav: styles.calendarNav,\n nav_button_previous: classnames(\n styles.calendarNavButton,\n styles.calendarNavPrev,\n ),\n nav_button_next: classnames(styles.calendarNavButton, styles.calendarNavNext),\n caption: styles.calendarMonthCaption,\n caption_label: styles.calendarVhidden,\n caption_dropdowns: styles.calendarCaptionDropdowns,\n dropdown: styles.calendarDropdown,\n dropdown_month: styles.calendarDropdown,\n dropdown_year: styles.calendarDropdown,\n nav_icon: styles.calendarChevron,\n vhidden: styles.calendarVhidden,\n tfoot: styles.calendarFooter,\n};\n\nconst NAV_ICON_SIZE = 12;\n\nfunction IconLeft(): React.ReactElement {\n return <ChevronLeft size={NAV_ICON_SIZE} />;\n}\n\nfunction IconRight(): React.ReactElement {\n return <ChevronRight size={NAV_ICON_SIZE} />;\n}\n\nexport const CALENDAR_COMPONENTS: {\n IconLeft: () => React.ReactElement;\n IconRight: () => React.ReactElement;\n} = { IconLeft, IconRight };\n\nexport interface DateCalendarProps {\n dateSelected: Date | undefined;\n onSelect: (date: Date | undefined) => void;\n onTimeChange?: (date: Date) => void;\n onClear?: () => void;\n month?: Date;\n onMonthChange?: (month: Date) => void;\n min?: Date;\n max?: Date;\n todayButtonText?: string;\n clearButtonText?: string;\n}\n\nexport default function DateCalendar({\n dateSelected,\n onSelect,\n onTimeChange,\n onClear,\n month,\n onMonthChange,\n min,\n max,\n todayButtonText = \"Today\",\n clearButtonText = \"Clear\",\n}: DateCalendarProps): React.ReactElement {\n const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);\n const showTime = onTimeChange != null;\n\n const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;\n const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;\n const today = new Date();\n // Compare at midnight so the Today button stays enabled when min/max are\n // set to today's date at midnight (the common case for date-only bounds).\n const todayMidnight = new Date(\n today.getFullYear(),\n today.getMonth(),\n today.getDate(),\n );\n const isTodaySelectable = isDateInRange(todayMidnight, min, max);\n const applySelectedTime = useCallback(\n (selected: Date): Date => {\n // Calendar day buttons provide local-midnight dates. In datetime mode,\n // keep the currently visible time when the user changes only the day.\n // The Today action intentionally bypasses this path and uses wall-clock\n // time from `new Date()`.\n if (!showTime) {\n return selected;\n }\n if (dateSelected == null) {\n return selected;\n }\n const date = new Date(selected.getTime());\n date.setHours(dateSelected.getHours(), dateSelected.getMinutes(), 0, 0);\n return date;\n },\n [dateSelected, showTime],\n );\n const handleSelect = useCallback(\n (selected: Date | undefined) => {\n onSelect(selected == null ? undefined : applySelectedTime(selected));\n },\n [applySelectedTime, onSelect],\n );\n const handleTodayClick = useCallback(() => {\n if (!isTodaySelectable) {\n return;\n }\n onSelect(new Date());\n }, [isTodaySelectable, onSelect]);\n\n const calendarFooter = (\n <>\n {showTime && (\n <div className={styles.calendarTimeFooter}>\n <TimePicker value={dateSelected ?? null} onChange={onTimeChange} />\n </div>\n )}\n <div className={styles.calendarActionBar}>\n <ActionButton\n type=\"button\"\n appearance=\"minimal\"\n disabled={!isTodaySelectable}\n onClick={handleTodayClick}\n >\n {todayButtonText}\n </ActionButton>\n {onClear != null && (\n <ActionButton type=\"button\" appearance=\"minimal\" onClick={onClear}>\n {clearButtonText}\n </ActionButton>\n )}\n </div>\n </>\n );\n\n return (\n <DayPicker\n mode=\"single\"\n selected={dateSelected}\n onSelect={handleSelect}\n month={month}\n onMonthChange={onMonthChange}\n disabled={disabled}\n defaultMonth={dateSelected}\n classNames={CLASS_NAMES}\n components={CALENDAR_COMPONENTS}\n footer={calendarFooter}\n // Render month/year as dropdown selects + prev/next arrows,\n // so users can jump directly to any month/year without paging.\n captionLayout=\"dropdown-buttons\"\n fromYear={fromYear}\n toYear={toYear}\n showOutsideDays={true}\n // Always render 6 rows so the calendar height doesn't jump between months.\n fixedWeeks={true}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,7 +24,6 @@ import { stopPropagation } from "./calendarShared.js";
24
24
  import styles from "./DatePicker.module.css.js";
25
25
  import commonStyles from "./DatePickerCommon.module.css.js";
26
26
  import { LazyDateCalendar } from "./LazyDateCalendar.js";
27
- import { TimePicker } from "./TimePicker.js";
28
27
  import { useDateEditState } from "./useDateEditState.js";
29
28
 
30
29
  /**
@@ -116,6 +115,7 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
116
115
  max,
117
116
  onChange: handleChange
118
117
  });
118
+ const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
119
119
 
120
120
  // --- Input event handlers ---
121
121
 
@@ -208,16 +208,13 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
208
208
  return;
209
209
  }
210
210
  const date = new Date(selected.getTime());
211
- if (showTime && value != null) {
212
- date.setHours(value.getHours(), value.getMinutes());
213
- }
214
211
  handleChange(date);
215
212
  setDateValue(date);
216
213
  setVisibleCalendarMonth(date);
217
214
  if (shouldCloseOnSelection) {
218
215
  closePopover();
219
216
  }
220
- }, [handleChange, showTime, value, shouldCloseOnSelection, setDateValue, setInputValue, closePopover]);
217
+ }, [handleChange, shouldCloseOnSelection, setDateValue, setInputValue, closePopover]);
221
218
  const handleTimeChange = useCallback(time => {
222
219
  handleChange(time);
223
220
  setDateValue(time);
@@ -251,16 +248,6 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
251
248
  lastButton?.focus();
252
249
  }
253
250
  }, [stopEditing]);
254
-
255
- // --- Time picker ---
256
-
257
- const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
258
- const timeFooter = showTime ? /*#__PURE__*/React.createElement("div", {
259
- className: styles.osdkDatetimeTimeFooter
260
- }, /*#__PURE__*/React.createElement(TimePicker, {
261
- value: activeDateValue ?? null,
262
- onChange: handleTimeChange
263
- })) : undefined;
264
251
  const wrapperClassName = classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDatetimeInputWrapper, inputError != null && commonStyles.osdkDatePickerInputWrapperError);
265
252
  const isPopoverOpen = !disabled && isOpen;
266
253
 
@@ -334,12 +321,12 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
334
321
  }), /*#__PURE__*/React.createElement(LazyDateCalendar, {
335
322
  dateSelected: activeDateValue,
336
323
  onSelect: handleCalendarSelect,
324
+ onTimeChange: showTime ? handleTimeChange : undefined,
337
325
  onClear: handleCalendarClear,
338
326
  month: visibleCalendarMonth,
339
327
  onMonthChange: setVisibleCalendarMonth,
340
328
  min: min,
341
- max: max,
342
- footer: timeFooter
329
+ max: max
343
330
  }), isModal && /*#__PURE__*/React.createElement("div", {
344
331
  onFocus: handleEndFocusBoundary,
345
332
  tabIndex: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","isDateInRange","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","styles","commonStyles","LazyDateCalendar","TimePicker","useDateEditState","DatePicker","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","ariaLabel","modal","disabled","isModal","shouldCloseOnSelection","popoverId","wrapperRef","inputRef","popoverRef","isOpen","setIsOpen","visibleCalendarMonth","setVisibleCalendarMonth","Date","skipReopenRef","editFormatFn","displayFormatFn","parseFn","handleChange","date","dateOnly","getFullYear","getMonth","getDate","isEditing","displayedValue","inputError","dateValue","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","handleFocus","current","undefined","handlePointerDown","focus","handleInputValueChange","nextValue","parsedDate","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","handleOpenChange","nextOpen","handleCalendarSelect","selected","getTime","setHours","getHours","getMinutes","handleTimeChange","time","handleCalendarClear","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","activeDateValue","timeFooter","createElement","className","osdkDatetimeTimeFooter","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","isPopoverOpen","Root","open","onOpenChange","ref","Trigger","nativeButton","render","osdkDatePickerInput","type","onValueChange","onFocus","onPointerDown","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","dateSelected","onSelect","onClear","month","onMonthChange","footer"],"sources":["DatePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n isDateInRange,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport styles from \"./DatePicker.module.css\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * Props for the shared DatePicker. Used directly by filter-list and\n * object-table; wrapped by action-form's FormFieldRenderer for the\n * `DATETIME_PICKER` field kind. `id` and `error` are optional so non-form\n * callers can omit them.\n *\n * When `formatDate` is omitted, ISO-like format is used (YYYY-MM-DD /\n * YYYY-MM-DD HH:mm).\n */\nexport interface DatePickerProps {\n /**\n * The HTML `id` attribute for the input element. Used for `<label htmlFor>`\n * association in form contexts. Optional in non-form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the input. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected Date, or `null` for empty. */\n value: Date | null;\n\n /** Called when the user selects or types a new date. */\n onChange?: (value: Date | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest date the user can select. */\n min?: Date;\n\n /** The latest date the user can select. */\n max?: Date;\n\n /** Whether to show a time picker alongside the date. */\n showTime?: boolean;\n\n /**\n * Whether to close the popover after selecting a date.\n * @default true when `showTime` is false, false when `showTime` is true\n */\n closeOnSelection?: boolean;\n\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n\n /**\n * Formats a Date for display in the input field when not editing.\n * When typing, the input shows the parsable format (YYYY-MM-DD or\n * YYYY-MM-DD HH:mm). Provide a matching `parseDate` if using a custom\n * format.\n */\n formatDate?: (date: Date) => string;\n\n /**\n * Parses a user-typed string back into a Date. Must be the inverse of\n * `formatDate` — if `formatDate(d)` produces string `s`, then\n * `parseDate(s)` must return an equivalent Date. When omitted, defaults\n * to parsing \"YYYY-MM-DD\" (date-only) or \"YYYY-MM-DD HH:mm\" (with time).\n */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Ref forwarded to the portal container element. Used to track portaled\n * content for click-outside detection.\n */\n portalRef?: React.Ref<HTMLDivElement>;\n\n /**\n * Element that receives the date picker portal. Use this when rendering\n * inside modal dialogs so popovers stay in the dialog's stacking and\n * focus context instead of being appended directly to document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Accessible label for the input when there is no adjacent `<label>`\n * element.\n */\n ariaLabel?: string;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\nexport const DatePicker: React.NamedExoticComponent<\n DatePickerProps\n> = React.memo(function DatePicker({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n ariaLabel,\n modal = \"trap-focus\",\n disabled = false,\n}: DatePickerProps) {\n const isModal = modal !== false;\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n // The wrapper is only a visual/positioning anchor. The input itself remains\n // the Popover.Trigger so axe does not see an interactive wrapper around an\n // interactive combobox.\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // activeDateValue is the selected/typed date; visibleCalendarMonth is only\n // the calendar viewport. Keeping the viewport separate lets typed dates jump\n // the calendar while next/previous month navigation still works.\n const [visibleCalendarMonth, setVisibleCalendarMonth] = useState<\n Date | undefined\n >(value ?? new Date());\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Single normalization gate: when the time picker is hidden, strip\n // hours/minutes/seconds so consumers receive a pure calendar date (local\n // midnight). Defined before useDateEditState so the hook's commit path also\n // goes through this gate.\n const handleChange = useCallback(\n (date: Date | null) => {\n if (onChange == null) {\n return;\n }\n if (date != null && !showTime) {\n const dateOnly = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n );\n onChange(dateOnly);\n } else {\n onChange(date);\n }\n },\n [onChange, showTime],\n );\n\n const {\n isEditing,\n displayedValue,\n inputError,\n dateValue,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: handleChange,\n });\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setVisibleCalendarMonth(value ?? undefined);\n setIsOpen(true);\n }, [startEditing, value]);\n\n const handlePointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n inputRef.current?.focus();\n handleFocus();\n }, [handleFocus]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n setInputValue(nextValue);\n const parsedDate = nextValue !== \"\" ? parseFn(nextValue) : undefined;\n if (parsedDate != null && isDateInRange(parsedDate, min, max)) {\n setVisibleCalendarMonth(parsedDate);\n }\n },\n [max, min, parseFn, setInputValue],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen && isModal) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n // Only meaningful when the popover traps focus; when non-modal we let\n // the browser advance focus naturally to the next document element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen, isModal],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n handleChange(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n if (showTime && value != null) {\n date.setHours(value.getHours(), value.getMinutes());\n }\n\n handleChange(date);\n setDateValue(date);\n setVisibleCalendarMonth(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n handleChange,\n showTime,\n value,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (time: Date) => {\n handleChange(time);\n setDateValue(time);\n },\n [handleChange, setDateValue],\n );\n\n const handleCalendarClear = useCallback(() => {\n handleChange(null);\n setDateValue(null);\n }, [handleChange, setDateValue]);\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n // --- Time picker ---\n\n const activeDateValue = isEditing && inputError == null\n ? dateValue\n : (value ?? undefined);\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDatetimeTimeFooter}>\n <TimePicker\n value={activeDateValue ?? null}\n onChange={handleTimeChange}\n />\n </div>\n )\n : undefined;\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on the input itself. Moving it to the wrapper would\n // make click handling simpler, but it would also nest an interactive combobox\n // inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n // When `modal === \"trap-focus\"`, base-ui traps Tab cycling and we render\n // a transparent dismiss layer for outside-click. When `false`, we rely\n // on base-ui's default outside-click — required for nested popover use\n // (e.g. inside FilterPopover) where a fullscreen dismiss layer would\n // intercept clicks intended for the parent.\n modal={modal}\n >\n <div\n ref={wrapperRef}\n className={wrapperClassName}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={handleInputValueChange}\n disabled={disabled}\n onFocus={handleFocus}\n onPointerDown={handlePointerDown}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n aria-label={ariaLabel}\n />\n }\n />\n </div>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n {isModal && (\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n )}\n <Popover.Positioner\n anchor={wrapperRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"Date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n {isModal && (\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n <LazyDateCalendar\n dateSelected={activeDateValue}\n onSelect={handleCalendarSelect}\n onClear={handleCalendarClear}\n month={visibleCalendarMonth}\n onMonthChange={setVisibleCalendarMonth}\n min={min}\n max={max}\n footer={timeFooter}\n />\n {isModal && (\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DatePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","isDateInRange","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","styles","commonStyles","LazyDateCalendar","useDateEditState","DatePicker","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","ariaLabel","modal","disabled","isModal","shouldCloseOnSelection","popoverId","wrapperRef","inputRef","popoverRef","isOpen","setIsOpen","visibleCalendarMonth","setVisibleCalendarMonth","Date","skipReopenRef","editFormatFn","displayFormatFn","parseFn","handleChange","date","dateOnly","getFullYear","getMonth","getDate","isEditing","displayedValue","inputError","dateValue","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","activeDateValue","undefined","handleFocus","current","handlePointerDown","focus","handleInputValueChange","nextValue","parsedDate","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","handleOpenChange","nextOpen","handleCalendarSelect","selected","getTime","handleTimeChange","time","handleCalendarClear","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","isPopoverOpen","createElement","Root","open","onOpenChange","ref","className","Trigger","nativeButton","render","osdkDatePickerInput","type","onValueChange","onFocus","onPointerDown","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","dateSelected","onSelect","onTimeChange","onClear","month","onMonthChange"],"sources":["DatePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n isDateInRange,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport styles from \"./DatePicker.module.css\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * Props for the shared DatePicker. Used directly by filter-list and\n * object-table; wrapped by action-form's FormFieldRenderer for the\n * `DATETIME_PICKER` field kind. `id` and `error` are optional so non-form\n * callers can omit them.\n *\n * When `formatDate` is omitted, ISO-like format is used (YYYY-MM-DD /\n * YYYY-MM-DD HH:mm).\n */\nexport interface DatePickerProps {\n /**\n * The HTML `id` attribute for the input element. Used for `<label htmlFor>`\n * association in form contexts. Optional in non-form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the input. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected Date, or `null` for empty. */\n value: Date | null;\n\n /** Called when the user selects or types a new date. */\n onChange?: (value: Date | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest date the user can select. */\n min?: Date;\n\n /** The latest date the user can select. */\n max?: Date;\n\n /** Whether to show a time picker alongside the date. */\n showTime?: boolean;\n\n /**\n * Whether to close the popover after selecting a date.\n * @default true when `showTime` is false, false when `showTime` is true\n */\n closeOnSelection?: boolean;\n\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n\n /**\n * Formats a Date for display in the input field when not editing.\n * When typing, the input shows the parsable format (YYYY-MM-DD or\n * YYYY-MM-DD HH:mm). Provide a matching `parseDate` if using a custom\n * format.\n */\n formatDate?: (date: Date) => string;\n\n /**\n * Parses a user-typed string back into a Date. Must be the inverse of\n * `formatDate` — if `formatDate(d)` produces string `s`, then\n * `parseDate(s)` must return an equivalent Date. When omitted, defaults\n * to parsing \"YYYY-MM-DD\" (date-only) or \"YYYY-MM-DD HH:mm\" (with time).\n */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Ref forwarded to the portal container element. Used to track portaled\n * content for click-outside detection.\n */\n portalRef?: React.Ref<HTMLDivElement>;\n\n /**\n * Element that receives the date picker portal. Use this when rendering\n * inside modal dialogs so popovers stay in the dialog's stacking and\n * focus context instead of being appended directly to document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Accessible label for the input when there is no adjacent `<label>`\n * element.\n */\n ariaLabel?: string;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\nexport const DatePicker: React.NamedExoticComponent<DatePickerProps> = React\n .memo(function DatePicker({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n ariaLabel,\n modal = \"trap-focus\",\n disabled = false,\n }: DatePickerProps) {\n const isModal = modal !== false;\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n // The wrapper is only a visual/positioning anchor. The input itself remains\n // the Popover.Trigger so axe does not see an interactive wrapper around an\n // interactive combobox.\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // activeDateValue is the selected/typed date; visibleCalendarMonth is only\n // the calendar viewport. Keeping the viewport separate lets typed dates jump\n // the calendar while next/previous month navigation still works.\n const [visibleCalendarMonth, setVisibleCalendarMonth] = useState<\n Date | undefined\n >(value ?? new Date());\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Single normalization gate: when the time picker is hidden, strip\n // hours/minutes/seconds so consumers receive a pure calendar date (local\n // midnight). Defined before useDateEditState so the hook's commit path also\n // goes through this gate.\n const handleChange = useCallback(\n (date: Date | null) => {\n if (onChange == null) {\n return;\n }\n if (date != null && !showTime) {\n const dateOnly = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n );\n onChange(dateOnly);\n } else {\n onChange(date);\n }\n },\n [onChange, showTime],\n );\n\n const {\n isEditing,\n displayedValue,\n inputError,\n dateValue,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: handleChange,\n });\n\n const activeDateValue = isEditing && inputError == null\n ? dateValue\n : (value ?? undefined);\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setVisibleCalendarMonth(value ?? undefined);\n setIsOpen(true);\n }, [startEditing, value]);\n\n const handlePointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n inputRef.current?.focus();\n handleFocus();\n }, [handleFocus]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n setInputValue(nextValue);\n const parsedDate = nextValue !== \"\" ? parseFn(nextValue) : undefined;\n if (parsedDate != null && isDateInRange(parsedDate, min, max)) {\n setVisibleCalendarMonth(parsedDate);\n }\n },\n [max, min, parseFn, setInputValue],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen && isModal) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n // Only meaningful when the popover traps focus; when non-modal we let\n // the browser advance focus naturally to the next document element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen, isModal],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n handleChange(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n handleChange(date);\n setDateValue(date);\n setVisibleCalendarMonth(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n handleChange,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (time: Date) => {\n handleChange(time);\n setDateValue(time);\n },\n [handleChange, setDateValue],\n );\n\n const handleCalendarClear = useCallback(() => {\n handleChange(null);\n setDateValue(null);\n }, [handleChange, setDateValue]);\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on the input itself. Moving it to the wrapper would\n // make click handling simpler, but it would also nest an interactive combobox\n // inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n // When `modal === \"trap-focus\"`, base-ui traps Tab cycling and we render\n // a transparent dismiss layer for outside-click. When `false`, we rely\n // on base-ui's default outside-click — required for nested popover use\n // (e.g. inside FilterPopover) where a fullscreen dismiss layer would\n // intercept clicks intended for the parent.\n modal={modal}\n >\n <div\n ref={wrapperRef}\n className={wrapperClassName}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={handleInputValueChange}\n disabled={disabled}\n onFocus={handleFocus}\n onPointerDown={handlePointerDown}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n aria-label={ariaLabel}\n />\n }\n />\n </div>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n {isModal && (\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n )}\n <Popover.Positioner\n anchor={wrapperRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"Date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n {isModal && (\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n <LazyDateCalendar\n dateSelected={activeDateValue}\n onSelect={handleCalendarSelect}\n onTimeChange={showTime ? handleTimeChange : undefined}\n onClear={handleCalendarClear}\n month={visibleCalendarMonth}\n onMonthChange={setVisibleCalendarMonth}\n min={min}\n max={max}\n />\n {isModal && (\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n });\n"],"mappings":"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","ignoreList":[]}
@@ -4,8 +4,3 @@
4
4
  .osdkDatetimeInputWrapper {
5
5
  outline: none;
6
6
  }
7
-
8
- .osdkDatetimeTimeFooter {
9
- display: flex;
10
- justify-content: center;
11
- }
@@ -1,7 +1,6 @@
1
1
  // CSS Module proxy for DatePicker.module.css
2
2
  const styles = {
3
- "osdkDatetimeInputWrapper": "DatePicker-module__osdkDatetimeInputWrapper___r6opEKtb",
4
- "osdkDatetimeTimeFooter": "DatePicker-module__osdkDatetimeTimeFooter___BJGF9UWo"
3
+ "osdkDatetimeInputWrapper": "DatePicker-module__osdkDatetimeInputWrapper___r6opEKtb"
5
4
  };
6
5
 
7
6
  export default styles;
@@ -162,6 +162,8 @@ export const DateRangePicker = /*#__PURE__*/React.memo(function ({
162
162
  })();
163
163
  const startInvalid = startInputError != null || hasOverlapError;
164
164
  const endInvalid = endInputError != null || hasOverlapError;
165
+ const activeStartDateValue = startInputError == null && startParsedValue != null ? startParsedValue : startDate ?? undefined;
166
+ const activeEndDateValue = endInputError == null && endParsedValue != null ? endParsedValue : endDate ?? undefined;
165
167
 
166
168
  // --- Focus handlers ---
167
169
 
@@ -359,11 +361,11 @@ export const DateRangePicker = /*#__PURE__*/React.memo(function ({
359
361
  to: endDate ?? undefined
360
362
  } : undefined;
361
363
  const timeFooter = showTime ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TimePicker, {
362
- value: startDate,
364
+ value: activeStartDateValue ?? null,
363
365
  onChange: handleStartTimeChange,
364
366
  label: "Start time"
365
367
  }), /*#__PURE__*/React.createElement(TimePicker, {
366
- value: endDate,
368
+ value: activeEndDateValue ?? null,
367
369
  onChange: handleEndTimeChange,
368
370
  label: "End time"
369
371
  })) : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","TimePicker","useDateEditState","EMPTY_RANGE","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangePicker","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","modal","disabled","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","isPopoverOpen","Root","open","onOpenChange","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangePicker.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * A date range represented as a start/end tuple. Either element may be\n * `null` when the range is partially selected.\n */\nexport type DateRange = readonly [Date | null, Date | null];\n\n/** Default empty range — both bounds are null. */\nexport const EMPTY_RANGE: DateRange = [null, null];\n\n/**\n * Props for the shared DateRangePicker. Used by filter-list's date-range\n * histogram and action-form's `DATE_RANGE_INPUT` field kind. `id` and\n * `error` are optional so non-form callers can omit them.\n *\n * Renders two text inputs (start / end) with a shared calendar popover\n * supporting range selection.\n */\nexport interface DateRangePickerProps {\n /**\n * The HTML `id` attribute for the start input element. Used for\n * `<label htmlFor>` association in form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the inputs. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected range, or `null` for empty. */\n value: DateRange | null;\n\n /** Called when the user selects or types a new range. */\n onChange?: (value: DateRange | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest selectable date. */\n min?: Date;\n\n /** The latest selectable date. */\n max?: Date;\n\n /** Whether to show time pickers for both dates. */\n showTime?: boolean;\n\n /** Placeholder text for the start date input. */\n placeholderStart?: string;\n\n /** Placeholder text for the end date input. */\n placeholderEnd?: string;\n\n /** Whether to allow start and end on the same day. @default true */\n allowSingleDayRange?: boolean;\n\n /** Formats a Date for display. Defaults to \"YYYY-MM-DD\". */\n formatDate?: (date: Date) => string;\n\n /** Parses a user-typed string back into a Date. */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Element that receives the date range picker portal. Use this when\n * rendering inside modal dialogs so popovers stay in the dialog's\n * stacking and focus context instead of being appended directly to\n * document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangePicker: React.NamedExoticComponent<\n DateRangePickerProps\n> = React.memo(function DateRangePicker({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n modal = \"trap-focus\",\n disabled = false,\n}: DateRangePickerProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={startDate}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={endDate}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n data-disabled={disabled || undefined}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n disabled={disabled}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isPopoverOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n disabled={disabled}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isPopoverOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DateRangePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","TimePicker","useDateEditState","EMPTY_RANGE","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangePicker","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","modal","disabled","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","activeStartDateValue","activeEndDateValue","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","isPopoverOpen","Root","open","onOpenChange","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangePicker.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * A date range represented as a start/end tuple. Either element may be\n * `null` when the range is partially selected.\n */\nexport type DateRange = readonly [Date | null, Date | null];\n\n/** Default empty range — both bounds are null. */\nexport const EMPTY_RANGE: DateRange = [null, null];\n\n/**\n * Props for the shared DateRangePicker. Used by filter-list's date-range\n * histogram and action-form's `DATE_RANGE_INPUT` field kind. `id` and\n * `error` are optional so non-form callers can omit them.\n *\n * Renders two text inputs (start / end) with a shared calendar popover\n * supporting range selection.\n */\nexport interface DateRangePickerProps {\n /**\n * The HTML `id` attribute for the start input element. Used for\n * `<label htmlFor>` association in form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the inputs. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected range, or `null` for empty. */\n value: DateRange | null;\n\n /** Called when the user selects or types a new range. */\n onChange?: (value: DateRange | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest selectable date. */\n min?: Date;\n\n /** The latest selectable date. */\n max?: Date;\n\n /** Whether to show time pickers for both dates. */\n showTime?: boolean;\n\n /** Placeholder text for the start date input. */\n placeholderStart?: string;\n\n /** Placeholder text for the end date input. */\n placeholderEnd?: string;\n\n /** Whether to allow start and end on the same day. @default true */\n allowSingleDayRange?: boolean;\n\n /** Formats a Date for display. Defaults to \"YYYY-MM-DD\". */\n formatDate?: (date: Date) => string;\n\n /** Parses a user-typed string back into a Date. */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Element that receives the date range picker portal. Use this when\n * rendering inside modal dialogs so popovers stay in the dialog's\n * stacking and focus context instead of being appended directly to\n * document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangePicker: React.NamedExoticComponent<\n DateRangePickerProps\n> = React.memo(function DateRangePicker({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n modal = \"trap-focus\",\n disabled = false,\n}: DateRangePickerProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n const activeStartDateValue =\n startInputError == null && startParsedValue != null\n ? startParsedValue\n : (startDate ?? undefined);\n const activeEndDateValue = endInputError == null && endParsedValue != null\n ? endParsedValue\n : (endDate ?? undefined);\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={activeStartDateValue ?? null}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={activeEndDateValue ?? null}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n data-disabled={disabled || undefined}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n disabled={disabled}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isPopoverOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n disabled={disabled}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isPopoverOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}